0

ちょっと遊んで調べてみたのですが、これがわかりません。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');

例がばかげているように見えることはわかっていますが、単純にしたかったのです。何か案は?

4

1 に答える 1

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');
于 2009-12-10T22:54:33.650 に答える