let声明在for循环语句中可以拿到正确的作用域
for (var i = 0;i<10;i++)
{
setTimeout(function(){console.log(i);},100*i); // 10个10
}
console.log('====')
console.log(i) //10
console.log('====')
for (let i = 0;i<10;i++)
{
setTimeout(function(){console.log(i);},100*i); // 0到9
}
console.log('====')
console.log(i) // i is not defined
console.log('====')
当用let
声明一个变量,它使用的是词法作用域或块作用域。 不同于使用 var
声明的变量那样可以在包含它们的函数外访问,块作用域变量在包含它们的块或for
循环之外是不能访问的。
当let
声明出现在循环体里时拥有完全不同的行为。 不仅是在循环里引入了一个新的变量环境,而是针对 每次迭代都会创建这样一个新作用域。 这就是我们在使用立即执行的函数表达式时做的事,所以在 setTimeout
例子里我们仅使用let
声明就可以了。