使用var声明的话,最后执行的setTimeout函数都是获取的全局变量里的i, 获取的是一个地方的i,所以是10.
而使用let声明,每次循环都会给i创建一个新的绑定,相当于每一次都是一个新的i。
使用 babel 转译一下可能看的更清楚:
ES6 写法:
for (let i = 0; i < 10; i++) {
setTimeout(() => {
console.log(i)
})
}
转译为:
"use strict";
var _loop = function _loop(i) {
setTimeout(function () {
console.log(i);
});
};
for (var i = 0; i < 10; i++) {
_loop(i);
}