我正在阅读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版。
答案 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计时器被清除,意味着不再有对内部函数的引用。这也意味着该内部函数引用的变量i
和int
不再被引用,这意味着GC可以将它们全部销毁。