JavaScript闭包和变量引用

JavaScript闭包和变量引用,javascript,closures,Javascript,Closures,我正在阅读Cameron的HTM5JavaScript和JQuery。在关于JavaScript和闭包的一节中,他给出了以下示例: function f2() { var i = 0; return function() { return ++i; }; } 当匿名函数在函数f2中定义时,它在当时存在的环境上“关闭”,并保留该环境的副本。由于变量i在声明函数时是可访问的,因此在调用函数时仍然可用JavaScript已经意识到匿名函数引用变量i,并且该函

我正在阅读Cameron的HTM5JavaScript和JQuery。在关于JavaScript和闭包的一节中,他给出了以下示例:

function f2() 
{ 
   var i = 0; 
   return function() { 
      return ++i; 
   }; 
}
当匿名函数在函数f2中定义时,它在当时存在的环境上“关闭”,并保留该环境的副本。由于变量i在声明函数时是可访问的,因此在调用函数时仍然可用JavaScript已经意识到匿名函数引用变量i,并且该函数没有被销毁,因此它没有销毁它所依赖的i变量

在这个粗体部分,他写道“JavaScript已经意识到…”这是否意味着当JS识别封闭变量(即闭包外部)和闭包之间的依赖关系时,它会保留对变量的引用以供以后使用,而如果对变量没有依赖关系,它会被销毁(垃圾收集)?那么下面的VarI将被销毁,而上面闭包示例中的VarI不是吗

function f2() 
{ 
   var i = 0; 
}

丹麦卡梅伦(2013年10月30日)。软件工程师学习HTML5、JavaScript和jQuery:基于标准的web应用程序指南(第74页)。西斯达尔出版公司。Kindle版

对你的问题的简短回答是“是的,这是正确的”,也许一个较长的例子会有所帮助

function main() {
    var i = 0;
    var int = setInterval(
        function() {
            console.log(++i);
            if ( i > 9 ) {
                clearInterval(int);
            }
        }, 100);
}
根据您给出的示例,变量
i
是从内部函数引用的,因此只要内部函数在使用,它就会一直保留


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

Yes。当它不再被引用时,它将被GC销毁。