【问题标题】:JavaScript understanding certain closure behaviorsJavaScript 理解某些闭包行为
【发布时间】:2012-03-06 12:44:14
【问题描述】:

以下代码的输出是 12 12。

var omg = function(){

        var space = {q:12} ;

        var sq = [];

        sq[0] = function(){
                console.log(space.q);
                space.q = 14;
        };

        sq[1] = function(){
                console.log(space.q);
        };



        return sq;

};

omg()[0]();
omg()[1]();
~                           

为什么输出不是 12 14 ?!?

【问题讨论】:

    标签: javascript node.js closures


    【解决方案1】:

    你执行了两次omg(),所以你得到了两个不同的闭包和单独的space对象。

    【讨论】:

      【解决方案2】:

      每个omg() 调用都会返回一个新函数。因此,omg()[0]() 调用会更改该特定实例的q 的本地值。我想如果你这样做:

      var a = omg()
      a[0](); 
      a[1](); 
      

      你会得到预期的输出。

      【讨论】:

      • Nit:它返回一个新数组,其中包含命名两个新函数的元素(属性)(在创建它们的词法范围内“关闭”space)...
      【解决方案3】:

      每个omg() 都会生成一个带有单独space 对象的单独闭包。

      要获得预期的行为,您需要调用omg()一次并使用相同的变量调用其中的两个函数:

      var arr = omg();
      arr[0]();
      arr[1]();
      

      【讨论】:

        猜你喜欢
        • 2011-05-10
        • 2016-01-30
        • 1970-01-01
        • 1970-01-01
        • 2013-03-25
        • 1970-01-01
        • 1970-01-01
        • 2018-03-15
        相关资源
        最近更新 更多