【发布时间】:2018-04-01 12:37:45
【问题描述】:
我试图了解作用域在 JS 中是如何工作的。你能告诉我如果我对这段代码的理解正确吗:
for(var i = 0; i<5; i++){
setTimeout(function timeoutHandler() {
var i = i;
console.log(i); //undefined
})
}
console.log 打印undefined 5 次。据我了解,当timeoutHandler 被执行时,它有自己的本地范围和自己的i 变量。那么在timeoutHandler 执行期间,解释器要求i 变量,发现它在本地范围内声明并使用这个声明的变量进行赋值,这是否正确?这解释了为什么它是undefined,但我不确定我是否完全正确。
谢谢
UPD 我不需要这段代码才能正常工作,我只是想了解为什么它在这种情况下会这样
【问题讨论】:
-
var i = i在 setTimeout 回调处理程序中为i和i创建了一个新范围,在再次将其分配给i之前尚未定义。因此i是undefined。 -
首先
var i = i没有意义。 -
var i = i等价于var i; i = i;。 -
尝试将
i作为setTimeout的参数传入 -
@JJJ 这可以解释为什么
i被设置为undefined。
标签: javascript scopes