首先我们看一个例子
for (var i=0;i<10;i++) {
setTimeout(function(){
console.log(i);
}, 1000);
}
请问这段代码输出是什么~?

把var换成let呢?

为什么会出现这种情况呢,接下来我们看完let和var的区别后就清楚了:
ES6 新增了let命令,用来声明局部变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效,而且有暂时性死区的约束。
1. 可以用let定义块级作用域变量:
在ES6之前,我们都是用var来声明变量,而且JS只有函数作用域和全局作用域,没有块级作用域,所以{}限定不了var声明变量的访问范围。也就是说,let只对它所在的最内侧块内有效,而var的范围至少是一个函数之内。
2. let 配合for循环的独特应用:
let非常适合用于 for循环内部的块级作用域。JS中的for循环体比较特殊,每次执行都是一个全新的独立的块作用域,用let声明的变量传入到 for循环体的作用域后,不会发生改变,不受外界的影响。
3. let没有变量提升与暂时性死区:
用let声明的变量,不存在变量提升。而且要求必须 等let声明语句执行完之后,变量才能使用,不然会报Uncaught ReferenceError错误。
4. let变量不能重复声明:
let不允许在相同作用域内,重复声明同一个变量。否则报错:Uncaught SyntaxError: Identifier 'XXX' has already been declared
网友评论