根据输入参数调用嵌套函数

时间:2014-02-07 06:07:56

标签: javascript closures nested-function

我有这样的功能。

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数组中给出的嵌套函数?

谢谢。

3 个答案:

答案 0 :(得分: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');

这样,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');

答案 1 :(得分:0)

编辑:

您必须使函数成为对象的成员。

var funcFactory = {
    a:function(){
        console.log('func a');
    },
    b:function(){
        console.log('func b');
    },
    c:function(){
        console.log('func c');
    },
    d:function(){
        console.log('func d');
    },
    call:function(input1, input2, input3){     
        for(var i=0; i<input1.length; i++){
           var name = input1[i];
            this[name](); // Doesn't work;
        }
    }
}
funcFactory.call(['b','d'],foo,bar);

答案 2 :(得分:0)

替换名称(); with eval(name +'()');