现在开始学ES6新增的语法
ES6中新增的用于声明变量的关键字
let
特点:
- let声明只在所处的块级有效
块级就是一对大括号{ }产生的作用域
作用域外的打印b变量会报错
- let关键字可以防止循环变量变成全局变量
对比一下我们以前的循环
但是如果我们换成let的话, i就只在块级作用域中有效了
- let不存在变量提升
之前我们使用的var是有变量提升的,可以先使用,后声明,但这其实是不合理的,现在就不存在变量提升了
但是用let的话就会直接报错
- 暂时性死区
let关键字声明的变量会被整体绑定在这个块级区域,不再受外部代码影响
来看一道经典的面试题:
先来看看var的版本:
函数执行时在自己的作用域是找不到自己的变量i值的,根据作用域链查找原则,要向上一层作用域中查找(就是全局作用域),在全局作用域有变量i,由于函数执行时,循环早已经执行完了。当i=2时,循环完毕,打印的i是全局变量,所以两个函数输出的都是全局变量i的值,也就是2
此题的关键点在于变量i是全局的,函数执行时输出的全是全局作用于下的i值
let版本
由于用let声明的变量i具有块级作用域,在循环结束之后产生了两个块级作用域。
产生的两个块级作用域中都有自己的变量i,这是两个变量,互不影响,因为处于不同的块级作用域中,循环结束后数组中依然存储了两个变量i,函数执行时内部还是没有自己的变量i,还是要向上一级作用域中查找,在当前代码中函数的上一级作用域实际上就是循环产生的块级作用域,所以两个数组函数执行时要分别去查找自己对应的块级作用域中i的值。
此题的关键点在于每次循环会产生一个块级作用域,每个块级作用域中的变量都是不同的,函数执行时输出自己上一级(循环产生的块级作用域)作用域下的值
除此之外,ES6还新增了关键字const
const
作用: 声明常量,常量就是值(内存地址)不能变化的量
特点
- 具有块级作用域(和let一样的特点)
- 声明常量时必须赋值
- 常量赋值后,值不能修改.但是可以更改数据结构内部的值,比如数组或者对象,
上面的这个操作是根据数组的下标找到值并修改值,此时是可以更改成功的,因为没有改变ary这个常量在内存中的存储地址;但是下面的操作是给ary这个常量重新赋值,改变了内存地址,因此所以会报错
对象也是,能够修改某个属性,但是不能直接 修改整个对象,以为会直接改变内存地址.