Skip to content

Commit 1b550c7

Browse files
committed
edit let
1 parent ae9f668 commit 1b550c7

File tree

4 files changed

+79
-8
lines changed

4 files changed

+79
-8
lines changed

docs/class.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class Point {
3939

4040
上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。也就是说,ES5的构造函数Point,对应ES6的Point类的构造方法。
4141

42-
Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个保留字,直接把函数定义放进去了就可以了。
42+
Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个保留字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。
4343

4444
ES6的类,完全可以看作构造函数的另一种写法。
4545

docs/let.md

Lines changed: 60 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ a[6](); // 6
5555

5656
### 不存在变量提升
5757

58-
let不像var那样,会发生“变量提升”现象。
58+
`let`不像`var`那样,会发生“变量提升”现象。
5959

6060
```javascript
6161
function do_something() {
@@ -64,9 +64,9 @@ function do_something() {
6464
}
6565
```
6666

67-
上面代码在声明foo之前,就使用这个变量,结果会抛出一个错误。
67+
上面代码在声明`foo`之前,就使用这个变量,结果会抛出一个错误。
6868

69-
这也意味着typeof不再是一个百分之百安全的操作
69+
这也意味着`typeof`不再是一个百分之百安全的操作
7070

7171
```javascript
7272
if (1) {
@@ -75,7 +75,9 @@ if (1) {
7575
}
7676
```
7777

78-
上面代码中,由于块级作用域内typeof运行时,x还没有值,所以会抛出一个ReferenceError。
78+
上面代码中,由于块级作用域内typeof运行时,x还没有值,所以会抛出一个`ReferenceError`
79+
80+
### 暂时性死区
7981

8082
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
8183

@@ -137,7 +139,6 @@ bar();
137139

138140
上面代码中,函数bar的参数func,默认是一个匿名函数,返回值为变量foo。这个匿名函数的作用域就不是bar。这个匿名函数声明时,是处在外层作用域,所以内部的foo指向函数体外的声明,输出outer。它实际上等同于下面的代码。
139141

140-
141142
```javascript
142143
let foo = 'outer';
143144
let f = x => foo;
@@ -150,6 +151,10 @@ function bar(func = f) {
150151
bar();
151152
```
152153

154+
ES6规定暂时性死区和不存在变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在ES5是很常见的,现在有了这种规定,避免此类错误就很容易了。
155+
156+
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
157+
153158
### 不允许重复声明
154159

155160
let不允许在相同作用域内,重复声明同一个变量。
@@ -235,6 +240,31 @@ function f1() {
235240

236241
上面的函数有两个代码块,都声明了变量n,运行后输出5。这表示外层代码块不受内层代码块的影响。如果使用var定义变量n,最后输出的值就是10。
237242

243+
ES6允许块级作用域的任意嵌套。
244+
245+
```javascript
246+
{{{{{let insane = 'Hello World'}}}}};
247+
insane // "Hello World"
248+
```
249+
250+
上面代码使用了一个五层的块级作用域。外层作用域无法读取内层作用域的变量。
251+
252+
```javascript
253+
{{{{
254+
{let insane = 'Hello World'}
255+
console.log(insane); // 报错
256+
}}}};
257+
```
258+
259+
内层作用域可以定义外层作用域的同名变量。
260+
261+
```javascript
262+
{{{{
263+
let insane = 'Hello World';
264+
{let insane = 'Hello World';}
265+
}}}};
266+
```
267+
238268
块级作用域的出现,实际上使得获得广泛应用的立即执行匿名函数(IIFE)不再必要了。
239269

240270
```javascript
@@ -267,6 +297,29 @@ function f() { console.log('I am outside!'); }
267297

268298
上面代码在ES5中运行,会得到“I am inside!”,但是在ES6中运行,会得到“I am outside!”。这是因为ES5存在函数提升,不管会不会进入if代码块,函数声明都会提升到当前作用域的顶部,得到执行;而ES6支持块级作用域,不管会不会进入if代码块,其内部声明的函数皆不会影响到作用域的外部。
269299

300+
```javascript
301+
{
302+
let a = 'secret';
303+
function f() {
304+
return a;
305+
}
306+
}
307+
f() // 报错
308+
```
309+
310+
上面代码中,块级作用域外部,无法调用块级作用域内部定义的函数。如果确实需要调用,就要像下面这样处理。
311+
312+
```javascript
313+
let f;
314+
{
315+
let a = 'secret';
316+
f = function () {
317+
return a;
318+
}
319+
}
320+
f() // "secret"
321+
```
322+
270323
需要注意的是,如果在严格模式下,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块、循环代码块)的声明都会报错。
271324

272325
## const命令
@@ -293,10 +346,10 @@ if (true) {
293346
const MAX = 5;
294347
}
295348

296-
// 常量MAX在此处不可得
349+
MAX // Uncaught ReferenceError: MAX is not defined
297350
```
298351

299-
const命令也不存在提升,只能在声明的位置后面使用。
352+
const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
300353

301354
```javascript
302355
if (true) {

docs/object.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,23 @@ getPoint()
6464
// {x:1, y:10}
6565
```
6666

67+
赋值器和取值器,也可以采用简洁写法。
68+
69+
```javascript
70+
var cart = {
71+
_wheels: 4,
72+
get wheels () {
73+
return this._wheels
74+
},
75+
set wheels (value) {
76+
if (value < this._wheels) {
77+
throw new Error('hey, come back here!')
78+
}
79+
this._wheels = value
80+
}
81+
}
82+
```
83+
6784
## 属性名表达式
6885

6986
JavaScript语言定义对象的属性,有两种方法。

docs/reference.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
- Kyle Simpson, [For and against let](http://davidwalsh.name/for-and-against-let): 讨论let命令的作用域
3232
- kangax, [Why typeof is no longer “safe”](http://es-discourse.com/t/why-typeof-is-no-longer-safe/15): 讨论在块级作用域内,let命令的变量声明和赋值的行为
3333
- Axel Rauschmayer, [Variables and scoping in ECMAScript 6](http://www.2ality.com/2015/02/es6-scoping.html): 讨论块级作用域与let和const的行为
34+
- Nicolas Bevacqua, [ES6 Let, Const and the “Temporal Dead Zone” (TDZ) in Depth](http://ponyfoo.com/articles/es6-let-const-and-temporal-dead-zone-in-depth)
3435

3536
## 解构赋值
3637

0 commit comments

Comments
 (0)