1

我在 JavaScript 中有一个私有函数的名称作为字符串,如何调用该函数?

var test = function () {

    this.callFunction = function(index) {
        return this["func" + index]();
    }

    function func1() { }
    function func2() { }
    ...
    function funcN() { }
}

var obj = new test();
obj.callFunction(1);
4

4 回答 4

3

func1和朋友是局部变量,而不是对象的成员。你不能这样称呼他们(至少不能以任何理智的方式)。

用函数表达式(而不是函数声明)定义它们并将它们存储在一个数组中。

var test = function () {

    this.callFunction = function(index) {
        return funcs[index]();
    }
    var funcs = [
         function () {},
         function () {},
         function () {}
    ];
}

var obj = new test();
obj.callFunction(0);
于 2012-11-19T09:06:50.990 回答
1

正如您的代码所代表的那样,这些函数不作为实例的属性存在。您需要做的是将它们创建为上下文的属性。

var test = function () {

    this.callFunction = function(index) {
        return this["func" + index];
    }

    this.func1 = function() { }
    this.func2 = function() { }
    ...

}

var obj = new test();
obj.callFunction(1)();
于 2012-11-19T09:07:25.040 回答
0

您可以使用私有函数数组:

var test = function() {
    var func = [
        function() { return "one" },
        function() { return "two"; }
    ]
    this.callFunction = function(index) {
        return func[index]();
    }
}

var obj = new test();
var ret = obj.callFunction(1);
console.log(ret);​
​

http://jsfiddle.net/V8FaJ/

于 2012-11-19T09:13:15.627 回答
0

你可以使用评估

var test = function () {

    this.callFunction = function(index) {
        return eval("func" + index + '()');
    }

    function func1() {
        return 1;
    }

    function func2() {
        return 2;
    }

    function funcN() { }
};

var obj = new test();
obj.callFunction(2);

评估是邪恶的

于 2012-11-19T09:07:02.057 回答