1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 10:22:23 +00:00
This commit is contained in:
ruanyf 2015-09-05 10:50:37 +08:00
parent 1b550c7627
commit cd9fac819e

View File

@ -75,11 +75,11 @@ if (1) {
} }
``` ```
上面代码中由于块级作用域内typeof运行时x还没有值所以会抛出一个`ReferenceError` 上面代码中,由于块级作用域内`typeof`运行时,`x`还没有值,所以会抛出一个`ReferenceError`
### 暂时性死区 ### 暂时性死区
只要块级作用域内存在let命令它所声明的变量就“绑定”binding这个区域不再受外部的影响。 只要块级作用域内存在`let`命令它所声明的变量就“绑定”binding这个区域不再受外部的影响。
```javascript ```javascript
var tmp = 123; var tmp = 123;
@ -90,9 +90,9 @@ if (true) {
} }
``` ```
上面代码中存在全局变量tmp但是块级作用域内let又声明了一个局部变量tmp导致后者绑定这个块级作用域所以在let声明变量前对tmp赋值会报错。 上面代码中,存在全局变量`tmp`,但是块级作用域内`let`又声明了一个局部变量`tmp`,导致后者绑定这个块级作用域,所以在`let`声明变量前,对`tmp`赋值会报错。
ES6明确规定如果区块中存在let和const命令这个区块对这些命令声明的变量从一开始就形成了封闭作用域。凡是在声明之前就使用这些命令就会报错。 ES6明确规定如果区块中存在`let``const`命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些命令,就会报错。
总之在代码块内使用let命令声明变量之前该变量都是不可用的。这在语法上称为“暂时性死区”temporal dead zone简称TDZ 总之在代码块内使用let命令声明变量之前该变量都是不可用的。这在语法上称为“暂时性死区”temporal dead zone简称TDZ
@ -110,7 +110,7 @@ if (true) {
} }
``` ```
上面代码中在let命令声明变量tmp之前都属于变量tmp的“死区”。 上面代码中,在`let`命令声明变量`tmp`之前,都属于变量`tmp`的“死区”。
有些“死区”比较隐蔽,不太容易发现。 有些“死区”比较隐蔽,不太容易发现。
@ -122,7 +122,7 @@ function bar(x = y, y = 2) {
bar(); // 报错 bar(); // 报错
``` ```
上面代码中调用bar函数之所以报错是因为参数x默认值等于另一个参数y而此时y还没有声明属于”死区“。 上面代码中,调用`bar`函数之所以报错,是因为参数`x`默认值等于另一个参数`y`,而此时`y`还没有声明,属于”死区“。
需要注意的是函数的作用域是其声明时所在的作用域。如果函数A的参数是函数B那么函数B的作用域不是函数A。 需要注意的是函数的作用域是其声明时所在的作用域。如果函数A的参数是函数B那么函数B的作用域不是函数A。
@ -137,7 +137,7 @@ function bar(func = x => foo) {
bar(); bar();
``` ```
上面代码中函数bar的参数func默认是一个匿名函数返回值为变量foo。这个匿名函数的作用域就不是bar。这个匿名函数声明时是处在外层作用域所以内部的foo指向函数体外的声明输出outer。它实际上等同于下面的代码。 上面代码中,函数`bar`的参数`func`,默认是一个匿名函数,返回值为变量`foo`。这个匿名函数的作用域就不是`bar`。这个匿名函数声明时,是处在外层作用域,所以内部的`foo`指向函数体外的声明,输出`outer`。它实际上等同于下面的代码。
```javascript ```javascript
let foo = 'outer'; let foo = 'outer';