【发布时间】:2015-11-13 05:41:16
【问题描述】:
这样好吗?
for (var i = 0; i < 10; i++) {
...
}
doSomething(i);
显然我希望i 在这里的值是 10。我的测试表明没问题,但这是定义的行为吗? (ES5)
【问题讨论】:
标签: javascript for-loop scope
这样好吗?
for (var i = 0; i < 10; i++) {
...
}
doSomething(i);
显然我希望i 在这里的值是 10。我的测试表明没问题,但这是定义的行为吗? (ES5)
【问题讨论】:
标签: javascript for-loop scope
是的,这是已定义的行为。当前版本的 JavaScript 没有块作用域,只有函数作用域。
但是,JavaScript (ES6) 的新标准引入了 let 语句(var 的替代方案),它将尊重块范围。
在以下代码中,您将无法在循环外访问i:
for (let i = 0; i < 10; i++) {
...
}
【讨论】:
这实际上是一个范围问题。您希望 i 在 for 循环之外可以访问吗?
如果是这样,并且您想确保,请在循环外定义 i。比如:
Duh...for 循环中的变量不会被阻塞(除非 ES6 中的 let 选项)。我已经知道了,但我累了,隔开了它。所以当然i 是可以访问的,在for 循环之外定义它是完全没有必要的。
我打算留下这个来提醒自己,当我累了并且还没有完全考虑我的答案时,不要急于求成。
var i;
for(i = 0;i < 10; i++) {
...
}
doSomething(i);
编辑:在仔细检查之后,无论如何 i 肯定是可访问的,这是已定义的行为,因此无论哪种方式都是安全的。
【讨论】:
var 被提升并且不受块范围的影响。