在ES5以及以前版本的JavaScript中,使用的是var来声明变量,并且不支持块级作用域。
ES6中新增了let和const两个关键字用于控制作用域。
作用域
作用域限制变量的访问区域,限制变量在当前作用域完成工作。
JS中采用的是词法作用域,即变量作用域取决于变量所在的代码区域。
ES5中的作用域:全局作用域、函数作用域。
ES6新增作用域:块作用域。
全局作用域
- 在所有函数之外定义的变量拥有全局作用域,该变量为全局变量
- 全局变量可以在当前页面任何的JS代码中访问。
函数作用域
在函数中声明的变量(包括函数参数)指定在其所生命的函数内被访问。
块作用域
由{ }界定的代码区域,le声明的变量可以访问块作用域。
let命令
1.基本用法
类似于var,但是所声明的变量只在let命令所在的代码块有效,即在块作用域中生效。
例如:
{
let a = 10;
var b = 20;
}
console.log(a); //a is not defined
console.log(b); //20
此时,console.log(a)会出现报错: a is not defined,而console.log(b)可以正常输出,不会报错。
注:undefined:声明了但未初始化;not defined:报错,意思是没有定义。
2.不存在变量提升
变量提升即在变量声明之前就可以使用。
var声明的变量无论其实际声明位置在何处,都会被是为声明于所在函数(或全局)的顶部,这就是变量提升。
var定义的变量会关联到顶层对象中,let和const不会。
console.log(a) //undefined
var a = 2;
console.log(b) //报错
let b = 1;
var定义的变量,在JS进行运行时,var定义的变量就已经存在了,但是没有进行赋值,因而在输出时就会输出undefined。
let定义的变量,在进行初始化之前都是不存在的,因而会报错。
for循环的计数器命令,很适合使用let命令。
此处的 i 只在 { }内有效,在块作用域之外使用 i 就会报错。
但是使用var的时候,全局范围内都有效,全局范围内只能存在一个同名的变量。
3.暂时性死区
在代码块内,使用let命令声明变量之前,该变量都是不可用的,这个区域被称为“暂时性死区”。
注:ES6中明确规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。
4.不允许重复声明
重复声明变量名相同的变量会报错。
const命令
基本用法
与let的用法类似,但是声明一个只读的常量,一旦声明,其值不能改变且必须立即初始化。
声明一个只读的常量,一旦声明,其值不能改变且必须立即初始化。