在JavaScript中调用一个字符串的函数,并保持在范围内

问题描述:

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

例:

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

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

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

我知道的例子看起来很傻,但我想保持简单。有任何想法吗?

传递给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

第二个解决方案看起来不错,谢谢 – 2009-12-10 22:59:19

+1

在你的第二个解决方案中,我建议你使用一个空对象,而不是''function'变量的数组,例如。 'var functions = {};' – CMS 2009-12-10 23:00:52

+0

@CMS:已更改。 – moonshadow 2009-12-10 23:16:08