2009-12-10 4 views
0

Я немного поиграл и искал, но я не могу понять это. У меня есть псевдо-частная функция внутри объекта JavaScript, которую нужно вызвать через eval (потому что имя функции построено динамически). Однако функция скрыта от глобальной области с помощью замыкания, и я не могу понять, как ссылаться на нее с помощью eval().Вызов функции строкой в ​​JavaScript и остающейся в области

Ex:

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

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

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

Я знаю пример выглядит глупо, но я хотел бы сохранить его простым. Есть идеи?

ответ

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'); 
+0

Второе решение отлично выглядит, спасибо –

+1

В вашем втором решении я бы рекомендовал использовать пустой объект, а не массив для переменной 'functions', например. 'var functions = {};' – CMS

+0

@CMS: так изменено. – moonshadow