目录
一. var命令
1. 作用域
var属于ES5的语法,只有两种作用域:
- 函数外部声明的变量,属于全局作用域,变量在整个程序中一直存在;
- 函数内部定义的变量,属于函数作用域,变量只在函数内部存在,外部无法读取。
2. 变量提升(hoisting)
- var声明的变量会被提升到其所在作用域的顶部,但只是声明的提升,赋值不会提升。
- 使用function命令声明函数,整个函数会像变量声明一样,被提升到代码头部。
二. let命令
1. 用法
- let声明的变量只在它所在的代码块有效
- 同一个作用域,不可使用let重复声明同一个变量,不能在函数内部最外层重新声明参数
- 进入当前作用域,let所声明的变量就不再受外部影响,但在声明语句之前,不可使用该变量
for循环例子:let声明的i只在本轮循环有效,每一次循环的i其实都是一个新变量
for (let i = 0; i < 3; i++) {
let i = 'abc';
console.log(i);
}
// abc
// abc
// abc
另外,for循环还有一个特别之处,设置循环变量的部分是一个父作用域,循环体内部是一个单独的子作用域。
2. 暂时性死区
在代码块内用let或const声明变量后,从块的开始到声明语句之前的区域,变量是不可访问的,这个区域就是暂时性死区TDZ,任何访问该变量的行为都会导致报错(ReferenceError)
三. const命令
1. 用法
- const一旦声明变量,必须立即赋值,否则报错
- const声明一个只读的常量,一旦声明,常量的值就不可改变,否则报错
- 同一作用域下,不可重复声明同名的变量
2. 本质
const实际保证的是,变量所指向的那个内存地址所保存的数据不得改动。对于简单类型的数据 (数值、字符串、布尔值),值就保存在变量所指的内存地址中,因此等同于常量;对于复合类型的数据 (对象、数组),内存地址中保存的是指向实际数据的指针。