【发布时间】:2016-04-05 22:03:57
【问题描述】:
我正在学习一些ES6 功能,当然还遇到了let 关键字及其新范围(不同于var)
我遇到了一个关于var 的棘手范围及其提升的例子。
但我无法完全理解为什么会得到这个结果:
var events = ['click', 'dblclick', 'keydown', 'keyup'];
for (var i = 0; i < events.length; i++) {
var event = events[i];
document.getElementById('btn').addEventListener(event, function() {
document.getElementById('result').innerHTML = 'event: ' + event;
});
}
<button id="btn">Click Me!</button>
<span id="result"></span>
我知道var event 被提升到for 循环之外,但为什么每次循环迭代都会获取数组中的最后一个事件('keyup')?addEventListener 函数是异步的,并且当它附加事件时,事件的值会发生变化?
【问题讨论】:
-
这不是关于提升,而是关于变量范围和闭包。
-
我了解元素 ('btn') 在 for 循环之外被提升。 元素没有被提升;变量是。
-
@torazaburo 谢谢,我的错。修好了。
-
只需将
var event = events[i];行替换为let event = events[i];。同时,您可以不接受建议使用匿名函数的笨拙的答案,对于块范围变量不再需要。 -
@torazaburo 我想你根本不明白我的问题。我知道
let和它的块作用域和关于var和它的函数作用域。我的问题是我不明白同一个变量只有 1 个实例,而不是 4 个不同的实例。 @void 帮助我理解了这一点,因此他的回答是有效的。我知道除了 IIFE(如.bind)之外,您还可以通过其他方式解决这个问题,但这与我的问题无关。
标签: javascript ecmascript-6 ecmascript-5 hoisting