Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >通过JSON传递一个JavaScript函数

通过JSON传递一个JavaScript函数
EN

Stack Overflow用户
提问于 2011-08-21 02:40:56
回答 7查看 11.1K关注 0票数 2

我有一个服务器端Python脚本,它返回一个包含客户端JavaScript参数的JSON字符串。

代码语言:javascript
代码运行次数:0
复制
# Python
import simplejson as json

def server_script()
  params = {'formatting_function': 'foobarfun'}
  return json.dumps(params)

这个foobarfun应该引用一个JavaScript函数。这是我的主要客户端脚本

代码语言:javascript
代码运行次数:0
复制
// JavaScript
function client_script() {
  var xhr = new XMLHttpRequest();
  xhr.open("GET", url, async=true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState == 4) {
      options = JSON.parse(xhr.responseText);
      options.formatting_function();
    }
  };
  xhr.send(null);
}

function foobarfun() {
  //do_something_funny_here...
}

当然,options.formatting_function()会抱怨“字符串是不可调用的”或类似的东西。

在使用Chrome的Inspect元素时,在Resources选项卡下,并为XHR > query导航左边的侧边栏,我发现client_scriptoptions解释如下。foobarfun被看作是字符串。

代码语言:javascript
代码运行次数:0
复制
// JavaScript
options = {"formatting_function": "foobarfun"}

我希望client_script能把options看作

代码语言:javascript
代码运行次数:0
复制
// JavaScript
options = {"formatting function": foobarfun}

当然,在Python中执行以下操作会让它抱怨它对foobarfun一无所知

代码语言:javascript
代码运行次数:0
复制
# Python
params = {'formatting_function': foobarfun}

问题:

我应该如何从服务器端准备JSON字符串,以便客户端脚本能够正确地解释它?在本例中,我希望foobarfun被解释为函数对象,而不是字符串。

或者是我应该在客户端做些什么?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-08-21 02:45:54

在JSON中无法获得所需的结果,因为JSON没有函数的概念,它纯粹是一种数据表示法。但有些事你可以在客户端做。

如果您的foobarfun函数是一个全局函数(我建议反对),那么您可以这样称呼它:

代码语言:javascript
代码运行次数:0
复制
window[options.formatting_function]();

这是因为全局函数是window对象的属性,您可以使用虚线表示法和文字(window.foobarfun)或使用括号内的符号和字符串(window["foobarfun"])来访问属性。当然,在后一种情况下,字符串不必是字符串文字,它可以是来自属性的字符串--例如,您的options.formatting_function属性。

但是我不建议使用全局函数,window对象已经非常拥挤了。相反,我将我的所有函数(在某些边缘情况下尽可能多)保留在主作用域函数中,这样我就不会向全局命名空间添加任何内容:

代码语言:javascript
代码运行次数:0
复制
(function() {
    function foobarfun() {
    }
})();

现在,如果这样做,您就不能在window上访问window,因为这样做的全部目的是避免将它放在window上。相反,您可以创建自己的对象并使其成为该对象的属性:

代码语言:javascript
代码运行次数:0
复制
(function() {
    var myStuff = {};

    myStuff.foobarfun = foobarfun;
    function foobarfun() {
    }

    function client_script() {
      var xhr = new XMLHttpRequest();
      xhr.open("GET", url, async=true);
      xhr.onreadystatechange = function() {
        if (xhr.readyState == 4) {
          options = JSON.parse(xhr.responseText);
          myStuff[options.formatting_function]();   // <== using it
        }
      };
      xhr.send(null);
    }
})();

通常,而不是这样:

代码语言:javascript
代码运行次数:0
复制
myStuff.foobarfun = foobarfun;
function foobarfun() {
}

你会看到人们写道:

代码语言:javascript
代码运行次数:0
复制
myStuff.foobarfun = function() {
};

我也不建议这样做,因为您的函数是匿名的(引用该函数的myStuff上的属性有一个名称,但该函数没有)。给函数命名是一件好事,它是帮助你的工具帮助你 (在调用堆栈、错误消息等中显示名称)。

你可能还会看到:

代码语言:javascript
代码运行次数:0
复制
myStuff.foobarfun = function foobarfun() {
};

这应该是有效的,它是正确的JavaScript。但不幸的是,各种JavaScript实现都有不同的But (称为命名函数表达式),尤其是在IE9之前的Internet,它将在两次不同的时间创建两个完全不同的函数

所有这些都表明,在客户机和服务器之间传递函数的名称通常意味着您想退一步,再次查看设计。数据应该驱动逻辑,但不是以这样的字面方式。尽管如此,确实有一些有效的用例来执行此操作,您很可能在您的情况下有一个用例。

票数 8
EN

Stack Overflow用户

发布于 2011-08-21 02:47:07

这个问题似乎对你有帮助:

当JavaScript函数的名称为字符串时,如何执行它

我想我要做的是将对这些方法的引用存储在一个对象文本中,然后通过属性访问它们。

例如,如果我想调用foobarfun,以及其他函数

代码语言:javascript
代码运行次数:0
复制
var my_functions = {
   foobarfun: function(){

   },
   ...
};

...

var my_fn = my_functions[options.formatting_function];
my_fn();
票数 1
EN

Stack Overflow用户

发布于 2011-08-21 03:17:55

可以认为返回字符串为javascript而不是json,通过设置MIME类型text/javascript

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7137731

复制
相关文章
使用 Nlog 将日志打印到 Logstash 的监控接口
Logstash提供了多种监听日志打印的方式,而Nlog也提供了多种输出日志的方式,当Nlog的输出配置与Logstash的输入配置相对应,就能够让Nlog打印出来的日志都存储到Elasticsearch中 以下介绍3种配置方式: 1)   文件 Logstash: input {       file {            path => "D:/Log/Application/*Log.txt"            type => "Application"       } } Nlog
Venyo
2018/03/15
1.2K0
将序列分解为单独的变量
python中,任何序列或可迭代的对象都可以通过一个简单的赋值操作来分解为单独的变量。前提是要求变量的总数和结构要与序列相吻合 #_*_coding:utf8_*_ p = (4, 5) x, y = p print(x) # 4 print(y) # 5 data = ['GuoJing', 30, ('杨过', '小龙女')] name, age, xialv = data print(name) # GuoJing print(xialv) # ('杨过', '小龙女') name, age, (
章鱼喵
2018/06/27
8820
怒打50行代码
redis中的数据都是以key/value的形式存储的,五大数据类型主要是指value的数据类型,包含如下五种:
暖月寒星
2020/03/10
4500
C算法实现:将字符串中的数字返回为整型数
今天看linux内核驱动的代码,发现一个算法写得挺简单,也有意思。 分享一下我的测试代码: #include <stdio.h> typedef int U32 ; U32 String2Dec( const char *pstr ) { char ch; U32 value; value = 0; //从字符串的第一个字符遍历到'\0' while( *pstr != '\0' ) { //获取字符
zy010101
2019/05/25
1.8K0
fscanf读取一行字符串-C中带有fscanf的无延迟循环
  C中带有fscanf的无延迟循环,c,C,您好,我在使用fscanf读取二进制文件时遇到问题,值没有被存储,而循环是无限的这是我的密码int main(){FILE *reads=fopen("E1.bin", "rb");;int temp=0,temp1=0,temp2=0;if (reads==NULL) {printf("Error");return 0;}else {while((fscanf(reads,"%d %d %d", temp, temp1, temp2))!= EOF
宜轩
2022/12/26
1.7K0
gin 框架将路由文件单独处理
首先,我们新建一个 routers 文件夹,这里面放置路由文件,包含一个总的router.go
句小芒
2022/12/29
6940
gin 框架将路由文件单独处理
c++如何将字符串转为数组(将字符串转换为数组)
string [] imgArr=imgData.Split(new char[]{‘,’});
全栈程序员站长
2022/07/29
7K0
C++中字符串的分割
下面开始正题,C++中字符串的分割。 1. 使用strtok函数进行字符串的分割 2. 使用stringstream类配合getline函数进行字符串的分割 3. 使用STL的find函数以及字符串类的substr函数进行字符串分割
卡尔曼和玻尔兹曼谁曼
2019/01/22
7.2K0
C++中字符串的分割
[C] C中的字符串处理函数
函数名: strcpy 功 能: 拷贝一个字符串到另一个 用 法: char *stpcpy(char *destin, char *source); 程序例:
轻舞飞扬SR
2021/02/24
2K0
C语言和C++中的字符串(string)
C语言字符串是字符的数组。单字节字符串顺序存放各个字符串,并用'\0'来表示字符串结束。在C语言库函数中,有一系列针对字符串的处理函数,比如说strcpy()、sprintf()、stoi()等,只能用于单字节字符串,当然也有一些函数用于处理Unicode字符串,比如wcscpy()、swprintf()等
用户7886150
2021/02/16
3K0
C语言 | 将字符串中的元音字母复制到另一个字符串中
解析:if语句判断一下每一个字母是否符合元音字母,读者看着道题的时候,需要注意一点的是如果用scanf函数是否可以,思考为什么要用gets函数?
小林C语言
2021/01/27
4.7K0
C语言 | 将字符串中的元音字母复制到另一个字符串中
c语言字符串赋值_c++中字符串变量
从大一学c语言到现在都快三年了,今天居然还在简单的字符串赋值的过程中犯了错误,应该记下来,以免日后再犯。
全栈程序员站长
2022/11/16
2.2K0
c# 将字符串转换为指定类型的值
private object GetValueByProperty(string key, string value, ref Type typeValue) { Type t = typeof(T); var property = t.GetProperty(key); if (property == null) { return value;
冰封一夏
2019/09/11
3.1K0
C++ 中的原始字符串文字及C++ 中的字符串数组(1-2)
theme: channing-cyan highlight: a11y-dark
鲸落c
2022/11/14
1.8K0
[译]C#和.NET中的字符串
原文地址:Jon Skeet:Strings in C# and .NET System.String 类型(在C#语言中对应的别名是string)是.NET最重要的类型之一,不幸的是在它身上存在了太
潘成涛
2018/01/18
2.5K0
C++中对字符串的分割
由于C++中没有split函数,因此,为了能够对获取的字符串进行按一定符号进行分割,在此学习了通过字符串的find()方法和substr()方法来实现split();具体描述如下:  //涉及到string类的两个函数find和substr:  //  //1、find函数  //原型: size_t find(const string& str, size_t pos = 0) const;  //功能: 查找子字符串第一次出现的位置。  //参数说明:str为子字符串,pos为初始查找位置。  //返回值: 找到的话返回第一次出现的位置,否则返回string::npos  //2、substr函数  //原型: string substr(size_t pos = 0, size_t n = npos) const;  //功能: 获得子字符串。  //参数说明:pos为起始位置(默认为0),n为结束位置(默认为npos)  //返回值: 子字符串
用户7886150
2021/01/16
2.3K0
fscanf读取一行字符串-C++的学习之路---12
  cin是C++编程语言中的标准输入流对象,即类的对象。cin主要用于从标准输入读取数据,这里的标准输入,指的是终端的键盘。此外,cout是流的对象,即类的对象,cerr是标准错误输出流的对象,也是 类的对象。这里的标准输出指的是终端键盘,标准错误输出指的是终端的屏幕。
宜轩
2022/12/26
5960
C语言 | 将字符串a复制为字符串b并输出b
解题思路:定义两个字符数组a和b,对a数组初始化。将a数组中的每一个字符逐个复制到b数组中,程序中a和b都定义为字符数组,通过地址访问其数组元素。
小林C语言
2020/12/14
1.9K0
C语言 | 将字符串a复制为字符串b并输出b
python 中单独调用 django 的数据库模块
玉面小色熊
2017/07/28
3.8K0
python 中单独调用 django 的数据库模块
Excel应用实践05:分页单独打印Excel表中指定行的数据
在上一篇文章《Excel应用实践04:分页单独打印Excel表中的数据》中,我们编写了一段简单的VBA代码,能够快速将工作表中每行数据放置到表格模板中依次打印出来。现在的问题是,我只想打印其中的一行,或者从第m行到第n行的数据,这如何实现呢?
fanjy
2019/07/19
1.5K0
Excel应用实践05:分页单独打印Excel表中指定行的数据

相似问题

python3打印到字符串

24

将0打印到文件安全吗?

48

Python 2.7.8打印到一行,不带逗号

21

Python 3打印到文件创建错误的新行

10

将小数点后的零打印到excel中

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档