1. ホーム
  2. javascript

[解決済み] 動的な関数に動的な数のパラメータを呼び出す【重複

2022-04-28 04:40:20

質問

これに関するトリックを探しています。私は、JavaScriptで特定のパラメータを渡して、動的な任意の関数を呼び出す方法を知っています、このような。

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

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

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

を使って、オプションで無制限のパラメータを渡す方法は知っています。 arguments の中にあるコレクションを使用します。 mainfunc に任意の数のパラメータを送信する方法がわかりません。 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');

解決方法は?

関数の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");