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