Skip to content

Commit

Permalink
暂时性死区 && 箭头函数
Browse files Browse the repository at this point in the history
  • Loading branch information
dptms committed Oct 23, 2017
1 parent 42c4e38 commit 9cdf068
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 1 deletion.
20 changes: 19 additions & 1 deletion var-let-const.md → 1.var-let-const.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,22 @@ for (var i = 1; i < 10; i++) {
}, 1000);
}
```
这里把 `var` 可以换成 `let`,`const`试试。
这里把 `var` 可以换成 `let`,`const`试试。

# ES6暂时性死区

```
console.log(color);
var color = 'yellow';
```

* 以上,`var` 的情况会变量提升,会报 `undefined`;
* 如果换成 `let``const` ,会报 `ReferenceError: color is not defined`;

> 在 ECMAScript 2015 中,let 绑定不受变量提升的约束,这意味着 let 声明不会被提升到当前执行上下文的顶部。在块中的变量初始化之前,引用它将会导致 ReferenceError(而使用 var 声明变量则恰恰相反,该变量的值是 undefined )。这个变量处于从块开始到 let 初始化处理的”暂存死区“之中。 [参考](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Statements/let),
# 如果选择声明变量的方式

* 默认使用 `const`
* 会重新更新变量使用 `let`
* 不应该在ES6中使用 `var`
72 changes: 72 additions & 0 deletions 2.arrow-function.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
# 箭头函数

### 写法灵活
```
const numbers = [2, 4, 7, 89, 234];
const double = numbers.map(function (number) {
return number * 2;
});
const double2 = numbers.map((number) => {
return number * 2;
});
console.log(double2);
```

以上,两种语法, `double``double2` 结果一样。

简而言之:
* 删掉 `function` 关键字
* 加上一个 `=>` 箭头
* 没有参数加 `()`
* 一个参数可选择加 `()`
* 多个参数 `,` 分隔

### 隐式返回
> 显示返回就是 `return` 关键字加上后面返回的内容
箭头函数中的隐士返回就是可以把 `renturn` 省略掉,去掉花括号 `{}`

```
const double2 = numbers.map(number => number * 2);
```

# this

```
const Dp = {
name: 'Dp',
hobbies: ['Coding', 'Sleeping', 'Reading'],
printHobbies: function () {
this.hobbies.map(function (hobby) {
console.log(`${this.name} loves ${hobby}`);
});
}
}
Dp.printHobbies();
```

以上,结果是
```
undefined loves Coding
undefined loves Sleeping
undefined loves Reading
```

原因 `this` 是在运行的时候绑定的,在以上 `map` 方法中的回调函数是一个独立的函数,当一个函数独立运行的时候,不是被作为对象的方法调用,也没有通过当没有 `apply` , `bind` , `call` 改变 `this` 值的话,这时候的 `this 指向 `window`。

所以我们可以改写
```
var self = this;
this.hobbies.map(function (hobby) {
console.log(`${self.name} loves ${hobby}`);
});
```
达到想要的效果。

我们还可以利用箭头函数的便利
```
this.hobbies.map(hobby => console.log(`${this.name} loves ${hobby}`));
```

0 comments on commit 9cdf068

Please sign in to comment.