ECMAScript 变量是松散类型的,意思是变量可以用于保存任何类型的数据。每个变量只不过是一个用于保存任意值的命名占位符。有三个关键字可以声明变量:var、let、const。其中 var 在ECMAScript 的所有版本中都可以使用,而 const 和 let 只能在ECMAScript 6 及更高版本中使用。
一、var
var可以定义单个变量和同时定义多个变量,在定义多个变量时用逗号隔开
在 ECMAScript 中 var 关键字声明的变量可以重复声明,但是赋值操作会覆盖前面已经给变量赋的值。值不仅可以改变,数据类型也可以改变。
var声明的全局变量全局作用域会挂载到 window 对象上,可以使用window. 的形式访问该变量,或者直接使用变量名的方式。在函数体内部的用var声明的变量是局部变量,当省略 var时,当前变量会定义为全局变量,但是当我要得到这个变量的值时,我们需要先执行一下函数
二、let
let 声明的范围是块作用域,而 var 声明的范围是函数作用域。
let 不可以重复声明变量,var 可以重复声明变量
切记同一作用域下 let 和 var 混合重复定义一个变量会报错
let的全局声明不会成为 window 对象的属性( var 声明的变量则会)
三、const
const 的行为和 let 基本相同,唯一一个重要的区别就是它在声明变量的同时必须初始化变量
const 声明的变量不允许修改
const 也是不可重复声明
const 声明的作用域也是块
const 声明限制只适用于它指向变量的引用。换句话说,如果 const 变量引用的是一个对象,那么修改这个对象内部的值不违反 const 的限制。引用未发生改变就行。
重点来了:var变量提升和let暂时性死区的区别!!!
变量提升本质上相当于把声明变量和初始化都提前到当前作用域顶部
var声明的变量会把变量声明放到当前作用域顶部,并且赋值为undefined
通过 let 声明的变量直到它们的定义被执行时才初始化。在变量初始化前访问该变量会导致 ReferenceError。该变量处在一个自块顶部到初始化处理的“暂存死区”中。(暂时性死区相当于把声明变量提升的当前作用域顶部,并没有初始化操作)