首先这个系列的文章只是一个笔记性质的,方便以后的翻看和查阅。内容来自于NICHOLAS.C.ZAKAS所写,刘振涛翻译的《深入理解ES6》,大家如果喜欢可以购买。
首先我们要搞明白为什么要有“块级作用域绑定”,那是因为原先我们使用var声明变量不管是在全局还是函数内部,最后都会被当做在当前作用域顶部声明的,这就是俗称的“提升”机制。例如下面的示例代码:
虽然value的初始化是在condition成立的条件下执行的,但是再其他作用域范围内也是可以访问的,js并不会报错,代码的输出如下:
这就是为什么要有“块级作用域”。
1、使用“let”声明
代码示例如下:
如果使用ES6的let声明变量,就没法再其它域内访问变量了。输如下:
2、使用“const”声明
const声明的是常量,声明的时候一定要初始化具体的值,一旦初始化了,就不能修改它的值。作用域的范围和let是一样的。
但有一点就是用const声明对象的时候,不能修改对象本身,但是可以修改对象属性的值。示例代码如下:
编译器报错了,person整个对象不能修改3、循环中使用“let”和“const”
(1)以前循环使用var定义一个i,那么在循环外面也可以访问i这个变量。如果使用let定义,那么这个变量就不能访问了,代码示例如下:
这里外部也可以访问i 这里就不能访问i(2)循环中的函数,直接来看代码
上面的代码结果是只会输出10次数字10,如果没用let来声明i,那么我们会用IIFE表达式来解决这个问题,如果用let声明i,那么结果就是输出数字0~9。
(3)我们也可以在循环中使用const,但是一旦是用const那么这个变量则不能修改,一旦修改就会报错,所以一般const只会用于for-in或者for-of。
4、全局块作用域绑定
一般我们使用var声明变量,那么这个变量就会绑定到window上面,所以我们很容易覆盖其他的变量。但是使用let则不会绑定到window上面。
网友评论