【问题标题】:Pass function name to function with JSON使用 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] 是一个字符串...不是函数。

标签: jquery json function parameters


【解决方案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。欲了解更多信息,请访问stackoverflow.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(); }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-21
        • 2015-07-10
        • 1970-01-01
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        • 2017-04-15
        • 2019-10-11
        相关资源
        最近更新 更多