通过JavaScript中的字符串调用函数并保持在范围内

时间:2009-12-10 22:46:49

标签: javascript function scope eval private

我一直在玩,并且搜索了一下,但我无法弄清楚这一点。我在JavaScript对象中有一个伪私有函数,需要通过eval调用(因为函数的名称是动态构建的)。但是,该函数被闭包隐藏在全局范围内,我无法弄清楚如何使用eval()来引用它。

例如:

var myObject = function(){
    var privateFunctionNeedsToBeCalled = function() {
        alert('gets here');
    };

    return {
        publicFunction: function(firstPart, SecondPart) {
            var functionCallString = firstPart + secondPart + '()';
            eval(functionCallString);
        }
    }
}();

myObject.publicFunction('privateFunctionNeeds', 'ToBeCalled');

我知道这个例子看起来很傻但我想保持简单。有什么想法吗?

1 个答案:

答案 0 :(得分:5)

传递给eval()的字符串在该eval()的范围内进行评估,所以你可以这样做

    return {
        publicFunction: function(firstPart, SecondPart) {
            var captured_privateFunctionNeedsToBeCalled = privateFunctionNeedsToBeCalled;
            var functionCallString = 'captured_' + firstPart + secondPart + '()';
            eval(functionCallString);
        }
    }

然而,更好的解决方案是避免完全使用eval():

var myObject = function(){
    var functions = {};
    functions['privateFunctionNeedsToBeCalled'] = function() {
        alert('gets here');
    };

    return {
        publicFunction: function(firstPart, secondPart) {
            functions[firstPart+secondPart]();
        }
    }
}();

myObject.publicFunction('privateFunctionNeeds', 'ToBeCalled');