使用 JSON 将函数名称传递给函数

Posted

技术标签:

【中文标题】使用 JSON 将函数名称传递给函数【英文标题】:Pass function name to function with JSON 【发布时间】:2014-02-07 06:21:59 【问题描述】:

我想使用 JSON 将两个函数名称传递给一个函数,但无法让它工作。我对这些东西感到头疼。

这是我的功能。 myFunc 应该调用传递给它的两个函数(myBefore 和 myAfter)。

function myFunc(obj) 
  var func = $.parseJSON(obj);
  if (typeof func[before] === "function") func[before]();
  // do some stuff
  if (typeof func[after] === "function") func[after]();


function myBefore() 
  alert("before");


function myAfter() 
  alert("after");

这就是我如何调用 myFunc

myFunc("before": "myBefore", "after" :"myAfter");

【问题讨论】:

func[before] 是一个字符串...不是函数。 【参考方案1】:

myFunc 应该调用传递给它的 2 个函数

你需要像func["before"]一样检查它,根据你的实现func[before]是一个字符串而不是一个函数

function myFunc(func) 
    //You don't need to parse. As its already a JSON
    //var func = $.parseJSON(obj); 

    if (typeof func["before"] === "function") 
        func["before"]();

    // do some stuff

    if (typeof func["after"] === "function") 
        func["after"]();


var myBefore = function () 
    alert("before");


var myAfter = function () 
    alert("after");


myFunc(
    "before": myBefore,
    "after": myAfter
);

DEMO

【讨论】:

感谢 Satpal 的工作演示。你能解释一下为什么函数 myBefore 和 myAfter 被分配为变量,是否可以像在我的原始代码中一样将它们创建为函数? @Damian,我更喜欢这样。使用命名函数也可以使用示例:jsfiddle.net/HBLA4/1。欲了解更多信息,请访问***.com/questions/114525/… 效果很好!我实际上更喜欢你对凯文的回答......我认为代码看起来更干净。如果我能授予你背心答案我会的,但我已经接受了凯文的:(【参考方案2】:

类似...

    function myFunc(obj) 
var func = $.parseJSON(obj);
      if (typeof func[before] === "function") func.before();
      // do some stuff
      if (typeof func[after] === "function") func.after();
    

【讨论】:

【参考方案3】:

你没有调用函数。你真正在做的是

("myBefore")();

这是一个错误。

如果 myBefore 和 myAfter 函数在全局范围内,您可以使用 window["stringName"]。

function myFunc(obj) 
    //var func = $.parseJSON(obj);  //if it is object being passed in than this is an error
    var func = obj;
    window[func[before]]();
    window[func[after]]();
 

【讨论】:

【参考方案4】:

由于函数是全局声明的,您可以从全局对象(窗口)中获取它们。

function myFunc(obj) 
  if (typeof window[obj.before] === "function") window[obj.before]();
  // do some stuff
  if (typeof window[obj.after] === "function") window[obj.after]();


function myBefore() 
  alert("before");


function myAfter() 
  alert("after");


myFunc("before": "myBefore", "after" :"myAfter");

JS 小提琴: http://jsfiddle.net/wvPgA/

【讨论】:

@Damian 很高兴我能帮上忙!【参考方案5】:

这个怎么样? window["yourfunctionname"]();

      var FunctionName =  func[before];         
      if (typeof(window[FunctionName]) === "function")
     
        window[FunctionName]();
      

    function myFunc(obj) 
      var func = $.parseJSON(obj);
      if (func[before] === "myBefore")  before();
      // do some stuff
      if (func[after] === "myAfter")  after(); 
    

【讨论】:

以上是关于使用 JSON 将函数名称传递给函数的主要内容,如果未能解决你的问题,请参考以下文章

函数名称空间与作用域

将带有修改的字段名称和白名单验证的 SQL 语句传递给 RPC 函数。它安全且普遍吗?

函数名传递与名称空间

SpringMVC JSONP JSON支持

无法将 json 值传递给函数

使用 EventSubscriber 将函数的返回值作为属性传递给 json