es6基础块级作用域绑定

239 阅读3分钟

块级声明

在var声明的变量中,无论在哪里声明在预编译的过程中都会提升到当前作用域的最顶端。带来了一些不必要的麻烦,所以出现了块级声明,块级声明出现在该作用域内后,作用域外无法访问。

1.存在的位置

块级声明存在在函数内部,以及{}之间。

2.声明类型

  • let
    let声明与var声明用法相同,用let声明变量,由于let不像var会提升所以一般放在封闭代码块的顶部。同时let禁止重声明,假设某个作用域块中存在某个标识符a,再let a 的话就会抛出错误。

  • const
    const声明的是常量,值被设定后就不能再更改,要注意常量声明的时候要初始化赋值,否则抛出错误。同时和let一样禁止重声明。

* 在严格模式和非严格模式下,都不可以为const定义的常量再赋值,否则报错
* const声明对象
   const声明不允许修改绑定,但是允许修改值。
```
const person = {
    name:‘ke’;
}
person.name = 'ha';//可以

person = {
    name:‘ha’;//不可以
} 
```
上述栗子中,绑定的是person对象,对象有一个name属性,修改person.name是修改的是绑定对象的值
不会抛出错误。
直接给person赋值,修改的是person的绑定,抛出错误

3.临死区域

临死区域tzd是块级访问的特色之一

js引擎在扫描代码发现变量声明时,要么放在作用域最顶端(var),要么放在TZD(遇到let和const),访问tzd中的变量会触发运行时的错误,只有执行过变量声明语句之后,变量才会从tzd区域中移出来,才可以正常访问。 思考一个问题,讨论的是块级作用域,那么下面的代码会不会抛出错误呢?

console.log(typeof val);
if(cond) {
    let val = 'blue';
}

结果是打印出undefined不会报错,原因是typeof是在if(){}代码块外面执行的,因此val并不存在于TZD中,不存在val这个绑定。

循环中的块作用域绑定

循环中使用块级绑定也是块级绑定的特色之一

let循环中的函数

经典例子:将var声明变量循环输出10个10的循环改成输出123456789。不需要使用立即执行函数

循环中的let声明

let每次迭代循环都会创建一个新变量,并以之前迭代中同名变量的值将其初始化

循环中的const声明

对于普通的for循环中,初始化变量使用const可以,但是改变这个变量的值就会抛出错误,如果后续循环不需要修改变量就可以使用const声明。 对于for-in和for-of循环中使用const行为与使用let一致,每次迭代不会修改已有的绑定而是创建一个新的绑定。

全局中块作用域绑定

在全局中var生命,会成为window的属性,也会无意中覆盖一个已经存在的全局属性。

在全局中使用let 和const,在全局作用下创建一个新的绑定,不会成为全局对象的属性,换句话说不能覆盖全局变量,不会破坏全局作用域,使用let和const会安全的多.

今天是es6学习第一天,开始了就不能间断