我正在尝试将任意数量的参数传递给函数。参数应该是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'”。
答案 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
。