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

时间:2013-09-25 13:36:50

标签: javascript

我正在尝试将任意数量的参数传递给函数。参数应该是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:Object func没有方法'apply'”。

3 个答案:

答案 0 :(得分: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]);
    }
}

答案 1 :(得分: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, []]});' ...

您可以(并且应该!)使用可调用函数设置对象,而不是使用全局命名空间。

答案 2 :(得分: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]);
        }
    }
};

正如您所看到的,您必须首先从f元素的名称获取您的函数window。然后f具有正确的类型,可以应用args