在Javascript中使用dynamic参数调用dynamic函数

我正在寻找一个关于这个的技巧。 我知道如何在Javascript中调用一个dynamic的,任意的函数,传递特定的参数,如下所示:

function mainfunc (func, par1, par2){ window[func](par1, par2); } function calledfunc(par1, par2){ // Do stuff here } mainfunc('calledfunc','hello','bye'); 

我知道如何使用mainfunc中的 arguments []集合传递可选的无限参数,但是,我无法计算如何发送任意数量的参数给mainfuncdynamic地发送到callfunc ; 我怎么能做到这样的事情,但有任何数量的可选参数(不使用这个丑陋的if-else )? :

 function mainfunc (func){ if(arguments.length == 3) window[func](arguments[1], arguments[2]); elseif(arguments.length == 4) window[func](arguments[1], arguments[2], arguments[3]); elseif(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'); 

使用函数的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)); } 

这将在浏览器之外工作(默认为全局空间)。 在mainfunc上使用调用也将起作用:

 function target(a) { alert(a) } var o = { suffix: " World", target: function(s) { alert(s + this.suffix); } }; mainfunc("target", "Hello"); mainfunc.call(o, "target", "Hello"); 

您的代码只适用于全局function,即。 window对象的成员。 要使用它的任意函数,传递函数本身,而不是它的名字作为一个string:

 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 …我想你可以在mainfunc使用this

 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方法返回并从参数数组中删除第一个值。 请注意,我们已经从数组原型中调用它,因为严格来说,“参数”不是一个真正的数组,因此不像普通数组那样inheritanceshift方法。


你也可以这样调用shift方法:

 [].shift.call(arguments); 

最简单的方法可能是:

 var func='myDynamicFunction_'+myHandler; var arg1 = 100, arg2 = 'abc'; window[func].apply(null,[arg1, arg2]); 

假设该目标函数已经附加到“窗口”对象。

如果你想传递一些其他的参数,你必须一起创build所有参数的数组,比如:

 var Log = { log: function() { var args = ['myarg here']; for(i=0; i<arguments.length; i++) args = args.concat(arguments[i]); console.log.apply(this, args); } } 

现在我正在使用这个:

 Dialoglar.Confirm = function (_title, _question, callback_OK) { var confirmArguments = arguments; bootbox.dialog({ title: "<b>" + _title + "</b>", message: _question, buttons: { success: { label: "OK", className: "btn-success", callback: function () { if (typeof(callback_OK) == "function") { callback_OK.apply(this,Array.prototype.slice.call(confirmArguments, 3)); } } }, danger: { label: "Cancel", className: "btn-danger", callback: function () { $(this).hide(); } } } }); }; 
 function a(a, b) { return a + b }; function call_a() { return a.apply(a, Array.prototype.slice.call(arguments, 0)); } console.log(call_a(1, 2)) 

控制台:3

难道你只是传递arguments数组?

 function mainfunc (func){ // remove the first argument containing the function name arguments.shift(); window[func].apply(null, arguments); } function calledfunc1(args){ // Do stuff here } function calledfunc2(args){ // Do stuff here } mainfunc('calledfunc1','hello','bye'); mainfunc('calledfunc2','hello','bye','goodbye'); 

如果有人仍然在寻找具有dynamic参数的dynamic函数调用 –

 callFunction("aaa('hello', 'world')"); function callFunction(func) { try { eval(func); } catch (e) { } } function aaa(a, b) { alert(a + ' ' + b); }