let命令
1.概念
let的用法和var相似,但是声明的变量只在let所在的块代码中有效。(块作用域:{ })
(注:如果声明的变量没有和let命令在同一个块作用域中则会报错(x is not defined),此处注意返回值为undefined是声明了未初始化,而x is not defined是未声明报错。)
示例如下:
2.基本用法
let命令很适合用在for循环中,因为for循环中有一个父作用域,循环体的内部还有一个独立的子作用域,而let 声明在for循环语句中可以拿到正确作用域。
3.Let命令不能变量提升
【1】变量的提升即将变量的声明提前到当前作用域的最前面,这样会减少代码的报错。
【2】Var声明的变量,使用与变量的提升,但是let命令却不可以进行变量的提升。
【3】在代码块中,使用let声明变量之前,该变量是不允许被使用的,这个区域被称为‘暂时性死区’(TDZ)。(ES6中规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量从一开始就形成封闭作用域)
4.let命令不允许重复声明
const命令
1.用法
【1】const命令与let用法一致,但是const命令是声明一个只读的常量,一旦声明,其值不能改变且必须立即初始化。
【2】当常量保存的不是一个值,而是一个地址的时候,该常量所引用的对象是可以更改成员的,只是不能更改该常量保存的地址。
作用域
1.概念
【1】变量或函数在起作用的区域。
【2】JS采用的是“词法作用域”(静态作用域),即在变量作用域取决于变量所在的代码区域。
【3】 ES6在ES5的基础上增加了“块作用域”,分别为全局作用域、函数作用域、块作用域。
(补充:ES5只有全局作用域和函数作用域会出现内层变量可能会覆盖外层变量、用来技术的循环变量泄露为全局变量等问题)
2.作用域链
当JS查找变量的时候,会从当前作用域开始跟随作用域链向上查找,直到找到变量的声明,如果达到全局作用域中仍未找到,就抛出一个引出错误异常。(举例如下)