从本地范围调用函数而不使用eval

时间:2011-12-29 10:20:15

标签: javascript closures

如果你有类似的东西:

var ASK = (function (){
   var i = 0, _this = this;
   function private(){
      console.log(i++)
   }
   return {
      call : function (methodName, args){
         eval(methodName + '(' + args + ')' );
      }
   }
})();

ASK.call('private');

可以在不使用eval的情况下调用ASK范围内的函数吗?为什么当我尝试使用_this[method]()时,我发现它不是一个功能? _this不应该引用ASK = (function(){})内的范围吗?

3 个答案:

答案 0 :(得分:3)

使用对象:

var ASK = (function (){
   var i = 0, _this = this;
   var myFuncs = {
       private: function(){
          console.log(i++)
       }
   }
   return {
      call : function (methodName, args){
         myFuncs[methodName](args);
      }
   }
})();

ASK.call('private');

答案 1 :(得分:0)

  

_this不应该引用ASK =(function(){})中的范围?

不。您没有将this引用的任何对象称为“通过”匿名函数,因此_this最终等于window / undefined(取决于严格模式)

你可能对this在JS中的工作方式感到困惑。对于许多好的解释,请点击谷歌。

请参阅 @kan 的代码片段,了解如何解决此问题,并注意闭包实际上为您解决了局部变量作用域问题,因此您并不需要关注{{ 1}}这里。

答案 2 :(得分:0)