我正在寻找一个关于这个的伎俩.我知道如何在Javascript中调用动态的任意函数,传递特定的参数,如下所示:
function mainfunc(func, par1, par2){ window[func](par1, par2); } function calledfunc(par1, par2){ // Do stuff here } mainfunc('calledfunc', 'hello', 'bye');
我知道如何在mainfunc中使用arguments []集合传递可选的无限参数,但是,我无法想象如何向mainfunc发送任意数量的参数以动态发送到calledfunc ; 我怎么能完成这样的事情,但有任意数量的可选参数(不使用丑陋的if-else)?:
function mainfunc(func){ if(arguments.length == 3) window[func](arguments[1], arguments[2]); else if(arguments.length == 4) window[func](arguments[1], arguments[2], arguments[3]); else if(arguments.length == 5) window[func](arguments[1], arguments[2], arguments[3], arguments[4]); } function calledfunc1(par1, par2){ // Do stuff here } function calledfunc2(par1, par2, par3){ // Do stuff here } mainfunc('calledfunc1', 'hello', 'bye'); mainfunc('calledfunc2', 'hello', 'bye', 'goodbye');
AnthonyWJone.. 184
使用函数的apply方法: -
function mainfunc (func){ window[func].apply(null, Array.prototype.slice.call(arguments, 1)); }
编辑:对我来说,稍微调整一下这会更有用: -
function mainfunc (func){ this[func].apply(this, Array.prototype.slice.call(arguments, 1)); }
这将在浏览器之外工作(this
默认为全局空间).在mainfunc上使用call也可以: -
function target(a) { alert(a) } var o = { suffix: " World", target: function(s) { alert(s + this.suffix); } }; mainfunc("target", "Hello"); mainfunc.call(o, "target", "Hello");
打败了我:) https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Function/apply获取更详细的文档 (7认同)
Ferdinand Be.. 21
您的代码仅适用于全局函数,即.window
对象的成员.要将它与任意函数一起使用,请将函数本身而不是其名称作为字符串传递:
function dispatch(fn, args) { fn = (typeof fn == "function") ? fn : window[fn]; // Allow fn to be a function object or the name of a global function return fn.apply(this, args || []); // args is optional, use an empty array by default } function f1() {} function f2() { var f = function() {}; dispatch(f, [1, 2, 3]); } dispatch(f1, ["foobar"]); dispatch("f1", ["foobar"]); f2(); // calls inner-function "f" in "f2" dispatch("f", [1, 2, 3]); // doesn't work since "f" is local in "f2"
这有效,但你应该注意到它不是被要求的 (2认同)
Greg.. 15
你可以用 .apply()
你需要指定一个this
...我想你可以使用this
内部mainfunc
.
function mainfunc (func) { var args = new Array(); for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); window[func].apply(this, args); }
James.. 12
这就是你需要的:
function mainfunc (){ window[Array.prototype.shift.call(arguments)].apply(null, arguments); }
第一个参数用作函数名称,所有剩余的参数用作被调用函数的参数...
我们可以使用该shift
方法返回然后从arguments数组中删除第一个值.请注意,我们已经从Array原型中调用它,因为严格来说,'arguments'不是真正的数组,所以不会shift
像常规数组那样继承方法.
你也可以像这样调用shift方法:
[].shift.call(arguments);
lubosdz.. 5
最简单的方法可能是:
var func='myDynamicFunction_'+myHandler; var arg1 = 100, arg2 = 'abc'; window[func].apply(null,[arg1, arg2]);
假设,该目标函数已经附加到"窗口"对象.
使用函数的apply方法: -
function mainfunc (func){ window[func].apply(null, Array.prototype.slice.call(arguments, 1)); }
编辑:对我来说,稍微调整一下这会更有用: -
function mainfunc (func){ this[func].apply(this, Array.prototype.slice.call(arguments, 1)); }
这将在浏览器之外工作(this
默认为全局空间).在mainfunc上使用call也可以: -
function target(a) { alert(a) } var o = { suffix: " World", target: function(s) { alert(s + this.suffix); } }; mainfunc("target", "Hello"); mainfunc.call(o, "target", "Hello");
您的代码仅适用于全局函数,即.window
对象的成员.要将它与任意函数一起使用,请将函数本身而不是其名称作为字符串传递:
function dispatch(fn, args) { fn = (typeof fn == "function") ? fn : window[fn]; // Allow fn to be a function object or the name of a global function return fn.apply(this, args || []); // args is optional, use an empty array by default } function f1() {} function f2() { var f = function() {}; dispatch(f, [1, 2, 3]); } dispatch(f1, ["foobar"]); dispatch("f1", ["foobar"]); f2(); // calls inner-function "f" in "f2" dispatch("f", [1, 2, 3]); // doesn't work since "f" is local in "f2"
你可以用 .apply()
你需要指定一个this
...我想你可以使用this
内部mainfunc
.
function mainfunc (func) { var args = new Array(); for (var i = 1; i < arguments.length; i++) args.push(arguments[i]); window[func].apply(this, args); }
这就是你需要的:
function mainfunc (){ window[Array.prototype.shift.call(arguments)].apply(null, arguments); }
第一个参数用作函数名称,所有剩余的参数用作被调用函数的参数...
我们可以使用该shift
方法返回然后从arguments数组中删除第一个值.请注意,我们已经从Array原型中调用它,因为严格来说,'arguments'不是真正的数组,所以不会shift
像常规数组那样继承方法.
你也可以像这样调用shift方法:
[].shift.call(arguments);
最简单的方法可能是:
var func='myDynamicFunction_'+myHandler; var arg1 = 100, arg2 = 'abc'; window[func].apply(null,[arg1, arg2]);
假设,该目标函数已经附加到"窗口"对象.