[英]Javascript - Help understanding variable behaviour
请看下面的两个例子。 在这两个示例中,变量i
被指定为0到9.在第一个示例中,在调用超时函数时, i
已经被赋值为9.我不知道超时时i
的值组。
for(var i = 0; i < 10; i++) {
var callback = function() {
alert('The first test returns: ' + i);
};
if(i === 0) setTimeout(callback, 2000);
}
在第二个选项中,我们可以通过将其传递到新的上下文来保持i
的值(如果这个术语不正确,请纠正我)。
for(var i = 0; i < 10; i++) {
var callback = (function(i) {
return function() {
alert('The second test returns: ' + i);
}
})(i);
if(i === 0) setTimeout(callback, 2000);
}
第二个例子给了我期望的值, 0
- 所以就垃圾收集而言,这是如何工作的? GC会在什么时候删除此值? 在回调函数结束时? 或者会有某种内存泄漏?
在第一个例子中, callback
是函数function(){alert('...' + i);}
,其中i
是定义callback
的范围中的变量,即i
in for(var i = 0; ...)
。
即使在i
为0
时setTimeout(callback, 2000)
,在2000ms之后,这是足够的时间来运行整个for
循环, i
将变为10,并且当callback
时, The first test returns: 10
将显示The first test returns: 10
。
但是,在进行闭包的第二个示例中, callback
本身仍然是function(){alert('...' + i);}
,但由于匿名函数中的参数i
其父作用域,因此i
在callback
是参数i
在匿名函数中,而不是i
in for(var i = 0; ...)
。
由于JavaScript使用call-by-value,当callback
由(function(i){...}(i))
设置时, i
将被“修复”,这使得带有参数i
的匿名函数然后立即通过值应用它i
( for(var i ...)
)。
GC在这里没有任何作用。 (GC的不同行为 - 除了内存使用和时间 - 意味着GC中存在错误。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.