3

I'm trying to pass arbitrary number of arguments to function. The arguments should be json type [function : arrayOfArgs]. The keys are functions and the values are arrays of the arguments, that should be passed to those functions.

At first, I considered function with only a number of argument

 function _gl(f,args){ f.apply(null,args); }

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

//calling the function

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

and it works pretty good .Now I'm trying to generalize that method

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

//and calling it

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

but i'm getting the following error "Uncaught TypeError: Object func has no method 'apply' ".

4

3 回答 3

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

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

于 2013-09-25T14:00:07.503 回答
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可以应用。

于 2013-09-25T14:01:03.913 回答
1
{func:['2','3']}

您正在使用一个(字符串)键创建一个对象,该键名为"func"value ['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]);
    }
}
于 2013-09-25T13:48:52.263 回答