0

私はこのような機能を持っています。

function myfun(input1, input2, input3){
    //
    // Other codes which deals with input2 and input3 (irrelevant)
    //
    function a(){
        console.log('func a');
    }
    function b(){
        console.log('func b');
    }
    function c(){
        console.log('func c');
    }
    function d(){
        console.log('func d');
    }
    // input1 is an array
    for(var i=0; i<input1.length; i++){
        var name = input1[i];
        name(); // Doesn't work as 'name' refers to a string;
        this[name](); // Doesn't work;
        // How can i execute the nested function whose name is stored in input array ?
    }
}
myfun(['b','d'], 'foo', 'bar');

名前がinput1配列で指定されているネストされた関数を呼び出すにはどうすればよいですか?

ありがとうございました。

4

3 に答える 3

3

編集

@Felixが示唆したように、これを行うには(効率の点で)はるかに良い方法があります-

var myfun = (function () {
    var util = {
        a: function (){
            console.log('method a');
        },
        b: function (){
            console.log('method b');
        },
        c: function (){
            console.log('method c');
        },
        d: function (){
            console.log('method d');
        }
    };

    return function (input1, input2, input3) {
        for(var i=0; i<input1.length; i++){
            var name = input1[i];
            util[name]();
        }
    };
}());

myfun(['b','d'], 'foo', 'bar');

この方法では、オブジェクトは 1 回だけ作成されます。以前の方法では、呼び出されるutilたびにオブジェクトが作成されます。myfun

ただし、この場合、メモリ フットプリントは以前のものよりも大きくなることに注意してください。参照utilは、閉鎖のために常にメモリに格納されます。


内部関数を作成するのではなく、メソッドを使用してオブジェクトを作成してみてください -

function myfun(input1, input2, input3){
    var util = {
        a: function (){
            console.log('method a');
        },
        b: function (){
            console.log('method b');
        },
        c: function (){
            console.log('method c');
        },
        d: function (){
            console.log('method d');
        }
    };

    for(var i=0; i<input1.length; i++){
        var name = input1[i];
        util[name]();
    }
}

myfun(['b','d'], 'foo', 'bar');
于 2014-02-07T06:11:31.507 に答える