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

Passing array of functions to another function

本文关键字:函数 另一个 数组      更新时间:2023-09-26

我正在尝试将任意数量的参数传递给函数。参数应该是 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']});"/>

但是我收到以下错误"未捕获的类型错误:对象func没有方法'应用'"。

您可以使用此代码 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

{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]);
    }
}

一种可能的解决方案;

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, []]});' ...

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