使用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);
}