### 一個參數的時候
~~~javascript
var f = v => v;
// 等同于
var f = function (v) {
return v;
};
~~~
### 多個參數或者沒有參數的時候
* 使用一個圓括號代表參數部分。
~~~javascript
var f = () => 5;
// 等同于
var f = function () { return 5 };
var sum = (num1, num2) => num1 + num2;
// 等同于
var sum = function(num1, num2) {
return num1 + num2;
};
~~~
* 如果箭頭函數的代碼塊部分多于一條語句,就要使用大括號將它們括起來,并且使用`return`語句返回。
```
var sum = (num1, num2) => {
num1 = 100;
return num1 + num2;
};
console.log(sum(1, 1));
```
### 箭頭函數可以與變量解構結合使用
```javascript
let person = {
first: "wang",
last: "yijia"
};
const full = ({ first, last }) \=> first + " " + last;
console.log(full(person));
```
### 可以簡化回調函數
~~~javascript
// 正常函數寫法
[1,2,3].map(function (x) {
return x * x;
});
// 箭頭函數寫法
[1,2,3].map(x => x * x);
~~~
### 尖頭函數中的this
* 函數體內的`this`對象,就是定義時所在的對象,而不是使用時所在的對象。
請問下面的代碼之中有幾個`this`?
~~~javascript
function foo() {
return () => {
return () => {
return () => {
console.log('id:', this.id);
};
};
};
}
var f = foo.call({id: 1});
var t1 = f.call({id: 2})()(); // id: 1
var t2 = f().call({id: 3})(); // id: 1
var t3 = f()().call({id: 4}); // id: 1
~~~
上面代碼之中,只有一個`this`,就是函數`foo`的`this`,所以`t1`、`t2`、`t3`都輸出同樣的結果。因為所有的內層函數都是箭頭函數,都沒有自己的`this`,它們的`this`其實都是最外層`foo`函數的`this`。不能用`call()`、`apply()`、`bind()`這些方法去改變`this`的指向。
### 擴展:關于call和apply
* 都是用于動態改變this的指向。只是參數不一樣。
~~~javascipt
function fun(arg1, arg2, ...){
// Your code
...
}
fun.call(this, arg1, arg2, ...)
fun.apply(this, [arg1, arg2, ...])
~~~