JavaScript闭包和变量引用
JavaScript Closures and variable reference
我正在阅读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
,间隔计时器被清除,这意味着不再有对内部函数的引用。这也意味着该内部函数引用的变量i
和int
不再被引用,这意味着GC可以将它们全部销毁。
相关文章:
- 通过另一个变量引用变量名称,或从变量确定变量名称
- 如何使用字符串引用变量
- 具有计算名称的引用变量
- j查询使用引用变量
- 如何处理 React 0.12+ 中的组件引用变量和 props
- 引用变量,它执行函数,但是向变量中添加字符串,将函数作为字符串而不是值返回
- 在单例模式中引用变量的根父级
- 如何在 Debian 上通过 node.js 中的引用变量停止子进程
- 可以通过画布上的引用变量来单击函数
- 使用原型从构造函数引用变量
- JQuery引用变量带有选择器,数据错误
- 引用变量
- Javascript在对象内通过字符串引用变量名
- 如何在javascript中使用不同的本地名称来引用变量或属性
- 为什么以及如何在console.log中引用变量来修复我遇到的加载错误?
- (术语)如何引用变量中的变量
- Javascript:使用"模块模式"引用变量,有什么想法吗?
- 解引用变量的闭包有用吗?
- 动态引用变量(对象)
- 定义中的引用变量