JavaScript闭包和变量引用

时间:2016-04-11 16:14:52

标签: javascript closures

我正在阅读Cameron的, HTM5 JavaScript& JQuery的。在他关于JavaScript和闭包的部分中,他给出了这个例子:

function f2() 
{ 
   var i = 0; 
   return function() { 
      return ++i; 
   }; 
}

当在函数f2中定义了匿名函数时,它“关闭”了它在那个时间点存在的环境,并保留了该环境的副本。由于在声明函数时可以访问变量i,因此在调用函数时它仍然可用。 JavaScript已经意识到匿名函数引用变量i,并且该函数尚未被销毁,因此它没有销毁它依赖的i变量

在这个大胆的部分,他写道“JavaScript已经实现了......”这是否意味着当JS识别封闭变量(即闭包之外)和闭包之间的依赖关系时,它保留对变量的引用以后使用,而如果没有依赖变量,它将被销毁(垃圾收集)?所以下面的var i会被破坏,而上面的闭包示例中的var i不是?

function f2() 
{ 
   var i = 0; 
}

Cameron,Dane(2013-10-30)。软件工程师学习HTML5,JavaScript和jQuery:基于标准的Web应用程序指南(p.74)。 Cisdal出版社。 Kindle版。

1 个答案:

答案 0 :(得分:0)

对你的问题的简短回答是“是的,这是正确的”或许更长的例子会有所帮助吗?

function main() {
    var i = 0;
    var int = setInterval(
        function() {
            console.log(++i);
            if ( i > 9 ) {
                clearInterval(int);
            }
        }, 100);
}

根据您给出的示例,变量i是从内部函数引用的,因此只要该内部函数正在使用中就会保持不变。

在这个例子中,int也因为同样的原因而保持活着,但在这里我们还演示了GC何时可以清理。一旦i > 9 Interval计时器被清除,意味着不再有对内部函数的引用。这也意味着该内部函数引用的变量iint不再被引用,这意味着GC可以将它们全部销毁。