Javascript 如何使用诸如“function someName(){}”之类的名称调用函数?

Javascript 如何使用诸如“function someName(){}”之类的名称调用函数?,javascript,Javascript,在JavaScript中,我有一个私有函数的名称作为字符串,如何调用该函数 var test = function () { this.callFunction = function(index) { return this["func" + index](); } function func1() { } function func2() { } ... function funcN() { } } var obj = ne

在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);
func1和friends是局部变量,而不是对象的成员。你不能那样叫他们,至少不能用任何理智的方式

使用函数表达式而不是函数声明来定义它们,并将它们存储在数组中

var test = function () {

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

var obj = new test();
obj.callFunction(0);
func1和friends是局部变量,而不是对象的成员。你不能那样叫他们,至少不能用任何理智的方式

使用函数表达式而不是函数声明来定义它们,并将它们存储在数组中

var test = function () {

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

var obj = new test();
obj.callFunction(0);
你可以使用eval

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);
eval是邪恶的

你可以使用eval

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);

eval是邪恶的

在代码中,函数不作为实例的属性出现。您需要做的是将它们创建为上下文的属性

var test = function () {

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

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

}

var obj = new test();
obj.callFunction(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)();

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

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);​
​

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

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);​
​

obj.callFunction0;没有定义。返回函数[索引];需要返回funcs[index]@Asad:No.obj.callFunction0;未定义,因为funcs中没有函数返回值。如果只有return funcs[index];,然后您只返回对函数的引用,您必须像obj.callFunction0一样调用;编辑:刚刚看到你的答案,我猜OP会选择他最喜欢的。但是callFunction这个名字表明这个函数实际上应该调用另一个函数,而不仅仅是返回一个引用。我错过了这个私有部分。回答得好@Asad-返回函数而不是调用函数。问题似乎是试图调用函数。@FelixKling是的,它未定义,因为函数没有返回值。我认为OP希望返回函数,并通过执行obj.callFunction0选择性地调用它们;为什么你认为这更糟;没有定义。返回函数[索引];需要返回funcs[index]@Asad:No.obj.callFunction0;未定义,因为funcs中没有函数返回值。如果只有return funcs[index];,然后您只返回对函数的引用,您必须像obj.callFunction0一样调用;编辑:刚刚看到你的答案,我猜OP会选择他最喜欢的。但是callFunction这个名字表明这个函数实际上应该调用另一个函数,而不仅仅是返回一个引用。我错过了这个私有部分。回答得好@Asad-返回函数而不是调用函数。问题似乎是试图调用函数。@FelixKling是的,它未定义,因为函数没有返回值。我认为OP希望返回函数,并通过执行obj.callFunction0选择性地调用它们;你为什么认为那更糟?那他们就不再是私人的了。这也与范围无关。@Quentin我通常将其称为范围。这不对吗?是的。这就是背景。作用域是函数及其父函数的一个因素,这样它们就不再是私有的了。这也与范围无关。@Quentin我通常将其称为范围。这不对吗?是的。这就是背景。范围是函数及其父函数的一个因素。