JavaScript闭包和变量引用

JavaScript Closures and variable reference

本文关键字:引用 变量 闭包 JavaScript      更新时间:2024-04-21

我正在阅读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应用程序指南(第74页)。Cisdal出版社。Kindle版。

问题的简短答案是"是的,这是正确的"也许一个更长的例子会有所帮助?

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

根据您给出的示例,变量i是从内部函数中引用的,因此只要该内部函数在使用中,它就会一直存在。

在本例中,int也出于同样的原因保持活动,但在这里我们还演示了GC如何在可能的情况下进行清理。一旦i > 9,间隔计时器被清除,这意味着不再有对内部函数的引用。这也意味着该内部函数引用的变量iint不再被引用,这意味着GC可以将它们全部销毁。