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