块级声明
在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学习第一天,开始了就不能间断