ES6 let与var的区别
- 作用域
用var定义的变量,作用域是整个封闭函数。
用let定义的变量,作用域是所在函数的块级或者子块作用域中。
var
for (var i in arr) { ... }
console.log(i);
// 能够打印出来i的值 i声明在for循环代码块里面,但是i是全局的能够在for循环外部调用
let
for (let i in arr) { ... }
console.log(i);
// ReferenceError: i is not defined 变量i作用域是for循环范围,for之外无法调用
- 变量提升
变量提升现象:浏览器在运行代码之前会进行预解析,首相解析函数声明、定义变量,解析完毕之后在对函数、变量进行运算、赋值等操作。
var
不论var声明的变量处于当前作用域的第几行,都会提升到变量作用域的头部。
console.log(a); // 打印结果 undefined
var a = 2;
打印出来结果说明这个变量声明并初始化为undefined,相当于
var a;
console.log(a);
a =2;
let
let声明的变量在作用域中不会出现提升。
console.log(a); // 报错 ReferenceError
let a = 2;
变量声明在第几行,该变量就初始化在第几行。在初始化之前调用是不可以的
- 重复声明
在变量所在作用域中,let声明的变量不允许出现相同名字的变量(即重复声明),如果声明了会报错;var声明的变量允许重复声明,只是先声明的变量的值会被后面的值所覆盖。
function () {
var a = 0
var a = 10
}
// 不报错 a的值为10
function () {
let a = 0
let a = 10
}
// 报错 无法做到
function () {
let a = 0
var a = 10
}
// 报错 无法共存
文中部分内容取自两位大佬,膜拜。
https://zhuanlan.zhihu.com/p/103053871
https://www.jianshu.com/p/21bd4fd9a7b6
如有不合理或者不合适的地方还请联系。