一尘不染

使用动态数量的参数调用动态函数

javascript

我正在寻找一个窍门。我知道如何在JavaScript中调用动态的任意函数,并传递特定的参数,如下所示:

function mainfunc(func, par1, par2){
    window[func](par1, par2);
}

function calledfunc(par1, par2){
    // Do stuff here
}

mainfunc('calledfunc', 'hello', 'bye');

我知道如何使用arguments内部的集合传递可选的,无限制的参数mainfunc,但是,我不知道如何发送任意数量的参数mainfunccalledfunc动态发送给它;我该如何完成这样的工作,但是要有任意数量的可选参数(不要使用丑陋的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');

阅读 263

收藏
2020-05-01

共1个答案

一尘不染

使用函数的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");
2020-05-01