将函数数组传递给另一个函数

3
我将尝试将任意数量的参数传递给函数。这些参数应该是JSON类型的[function:arrayOfArgs]。键是函数,值是应该传递给这些函数的参数数组。
起初,我只考虑了一个带有固定数量参数的函数。
 function _gl(f,args){ f.apply(null,args); }

 function func(a,b){ alert(a+b); }

//调用函数

<input type="button" value="test" onclick="_gl(func,['2','3']);"/>

它的效果相当不错。现在我正在尝试推广那种方法。

function _GL(){
      var arguments = _GL.arguments; 

      var i=0;
      for(i;i<arguments.length;i++)
      {
        var A=arguments[i];
        for(j in A) j.apply(null,A[j]); 
      } 
   }

//并且调用它

<input type="button" value="TEST" onclick="_GL({func:['2','3']});"/>

但是我遇到了以下错误:“Uncaught TypeError: 对象func没有方法'apply'”。

你传递的 func 是事件对象,它不是一个函数,也没有必要是一个函数。 - gdoron
你正在将数组 ['2', '3'] 传递给属性 func。 - 0xcaff
应该是 JSON 类型。JSON 是数据的字符串表示形式。你的数组不是“JSON 类型”。它只是一个“普通”的 JavaScript 数组。如果它是 JSON,那么它就是一个字符串。如果它不是一个字符串,那么它就不是 JSON。 - gen_Eric
3个回答

1
{func:['2','3']}

你正在创建一个带有名为"func"的字符串键和值['2', '3'] 的对象。字符串不是函数,所以它没有.apply()方法。
在对象中,你的键必须是字符串,不能使用其他类型作为键。
为了“概括”它,您应该传递一个函数和它们的参数的数组。像这样:

[[func, ['2','3']], [func2, ['abc']]

所以,如果你做了这个:
onclick="_GL([[func, ['2','3']], [func2, ['abc']]);"

然后您可以循环获取函数并调用它们。
function _GL(funcs){
    for(var i=0, len=funcs.length; i < len; i++){
        var func = funcs[i];
        func[0].apply(null, func[1]);
    }
}

感谢RockeT Hazmat的回答。我该怎么做才能让那个函数工作? - Paramore
@Paramore:我编辑了我的答案并给出了一个可能的解决方案。 - gen_Eric

1
一个可能的解决方案;
var _gl = function (callables) {

    // Loop through each property in the passed in object
    for (var fnName in callables) {

        // Only apply for properties that is local to `callables`
        if (callables.hasOwnProperty(fnName)) {
            window[fnName].apply(callables[property]);
        }

    }

};

... onclick='_gl({"MyFunction": ["a", 1, []]});' ...

不要使用全局命名空间,你可以(而且应该)设置一个对象来存储可调用的函数。


1
你可以使用这段代码 jsFiddle
_GL = function() {
    var arguments = _GL.arguments;
    var i = 0;
    for (i = 0; i < arguments.length; i++) {
        var arg = arguments[i];
        for (j in arg) {
            var f = window[j];
            f.apply(null, arg[j]);
        }
    }
};

正如您所见,您需要首先通过名称从window元素中获取函数f。然后f具有正确的类型,可以应用args

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接