当前位置:  开发笔记 > 编程语言 > 正文

在Javascript中使用动态参数调用动态函数

如何解决《在Javascript中使用动态参数调用动态函数》经验,为你挑选了5个好方法。

我正在寻找一个关于这个的伎俩.我知道如何在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]);

假设,该目标函数已经附加到"窗口"对象.



1> AnthonyWJone..:

使用函数的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获取更详细的文档

2> Ferdinand Be..:

您的代码仅适用于全局函数,即.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"


这有效,但你应该注意到它不是被要求的

3> Greg..:

你可以用 .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);
}



4> James..:

这就是你需要的:

function mainfunc (){
    window[Array.prototype.shift.call(arguments)].apply(null, arguments);
}

第一个参数用作函数名称,所有剩余的参数用作被调用函数的参数...

我们可以使用该shift方法返回然后从arguments数组中删除第一个值.请注意,我们已经从Array原型中调用它,因为严格来说,'arguments'不是真正的数组,所以不会shift像常规数组那样继承方法.


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

[].shift.call(arguments);



5> lubosdz..:

最简单的方法可能是:

var func='myDynamicFunction_'+myHandler;
var arg1 = 100, arg2 = 'abc';

window[func].apply(null,[arg1, arg2]);

假设,该目标函数已经附加到"窗口"对象.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有