javascript中的闭包,它们什么时候生效?

时间:2015-10-30 16:44:29

标签: javascript closures

我是js的新手,我正在尝试闭包。有些事我无法理解。 如果我写

var uniqueInteger = (function() { // Define and invoke
                        var counter = 0; // Private state of function below
                        return function() { return counter++; };
                    }());

我反复调用函数uniqueInteger()我得到0,1,2,3等等。似乎在调用函数后counter没有被销毁。它存储在哪里,因为它不是一个全局对象?

现在,如果我稍微更改代码并将uniqueInteger定义为

var uniqueInteger = (function() { // Define and invoke
                            var counter = 0; // Private state of function below
                            return function() { return counter++; };
                     });

我反复拨打uniqueInteger()()我获得的值是0.这怎么可能?

1 个答案:

答案 0 :(得分:4)

  

它存储在哪里,因为它不是全局对象?

在闭包创建的范围内。

  

现在,如果我稍微更改代码......我获得的值始终为0.这怎么可能?

因为每次在第二块代码中调用var counter = 0;时,都会重新运行表达式var counter = 0;(您还创建一个新的作用域并返回一个新函数,您可以立即调用它,因为您有{{ 1}})。

在第一个代码块中,您运行该函数一次并将其返回值分配给()(),因此将计数器设置为uniqueInteger的表达式仅评估一次。