for (var i = 1; i <= 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
setTimeout的回调与for循环(局部作用域)形成了闭包,每次循环都产生一个闭包,这些闭包共享了for循环的词法作用域中的i。i在经过6次计算后变成了6,所以后续每个闭包再打印i时都会显示6。
for (let i = 1; i <= 5; i++) {
setTimeout(function () {
console.log(i);
}, 1000);
}
for (var i = 1; i <= 5; i++) {
setTimeout(function (index) {
console.log(index);
}, 1000, i);
}
for (var i = 1; i <= 5; i++) {
(function (index) {
setTimeout(function () {
console.log(index);
}, 1000);
})(i)
}
for (var i = 1; i <= 5; i++) {
function timer(index) {
console.log(index);
}
setTimeout(timer.bind(this, i), 1000);
}
for (var i = 1; i <= 5; i++) {
this.j = i
setTimeout(() => {
console.log(this.j);
}, 1000);
}