1.块级作用域
级作用域由{ }包括,let和const是块级作用域,通常情况下范围比var要小;var不存在块级作用域,是方法作用域,只要在方法内定义了,整个方法中定义变量后的代码都可以使用这个变量。
块级作用域解决了ES5中的两个问题:
● 内层变量可以覆盖外层变量
● 用来计数的循环变量泄漏为全局变量
ES5中只有全局作用域和函数作用域,没有块级作用域,因此会带来上述两个问题。
2.变量提升
var声明的变量存在变量提升,但是let和const不存在,即只能在变量声明之后使用,否则会出错。
3.给全局添加属性
浏览器的全局对象是window,Node的全局对象是global,var声明的全局变量和函数,会被添加为window对象的属性和方法,但是使用 let 和 const 的顶级声明不会定义在全局上下文中,但在作用域链解析上效果是一样的。
if (true) {
var bar = 'bar';
let baz = 'baz';
const qux = 'qux';
}
// 用 var 声明的变量在函数作用域上都可访问
console.log(bar); // bar
// let 和 const 定义的变量在它们被定义的语句块之外不可访问
console.log(baz); // ReferenceError: baz is not defined
console.log(qux); // ReferenceError: qux is not defined
function foo() {
// 所有变量在函数中都可访问
var bar = 'bar';
let baz = 'baz';
const qux = 'qux';
console.log(bar); // bar
console.log(baz); // baz
console.log(qux); // qux
}
console.log(bar); // ReferenceError: bar is not defined
console.log(baz); // ReferenceError: baz is not defined
console.log(qux); // ReferenceError: qux is not defined
4.重复声明
var声明的变量,可以被重复声明,后声明的同名变量会自动覆盖之前声明的变量,但是let和const不可以。
5.暂时性死区
在使用let、const来声明变量之前,该变量是不能使用的,在声明变量前使用会报错,这在语法上称为暂时性死区。而var不存在这样的暂时性死区。
6.初识值设置
在声明变量时,var和let是不需要赋初始值的,但是const为常量声明方式,声明变量时必须初始化,在后面出现的代码中不能再修改该常量的值。const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
7.指针指向
let和const都是ES6新增的用于创建变量的语法,let创建的变量可以更改指针的指向,也就是可以重新赋值,但是const不可以,它是常量声明方式。
重新定义 | 修改值 | 声明提升 | 块级作用域 | 循环 |
---|---|---|---|---|
var | 可以 | 可以 | 会 | 严格来说不支持(function 支持) |
let | 不可以 | 可以 | 不会 | 支持 |
const | 不可以 | 不可以(除数组和对象) | 不会 | 支持 |