箭頭函式,在ES6出現的語法,有著更簡短的語法以及重新定義的 this
。
簡短的語法
箭頭函式與 function 的用法大致一致,可以傳入參數、也有大括號包起來,除此之外箭頭函式也有更簡短的寫法如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| var callSomeone = (someone) => { return someone + "say Hi"; }; console.log(callSomeone("Phoebe"));
var callSomeone = (someone) => someone + "say Hi"; console.log(callSomeone("Phoebe"));
var callSomeone = (someone) => someone + "say Hi"; console.log(callSomeone("Phoebe"));
var callSomeone = () => "Phoebe" + "say Hi"; console.log(callSomeone("Phoebe"));
|
沒有 arguments 參數
要使用 arguments 這個參數了解總共傳入了幾次並加總,但在箭頭函式內是沒有此變數的。
1 2 3 4 5 6
| let Money = 1000; const Spend = () => { let cash = 0; console.log(arguments); } Spend (10, 50, 100, 50, 5, 1, 1, 1, 500);
|
所以當需要使用 arguments 需維持使用 function
綁定的 this 不同
- 傳統函式:依呼叫的方法而定
- 箭頭函式:綁定到其定義時所在的物件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| var name = "全域先生"; var person = { name: "function小姐", callName: function () { console.log("1", this.name); setTimeout(() => { console.log("2", this.name); console.log("3", this); }, 10); }, callName2: () => { console.log("4", this.name); setTimeout(() => { console.log("5", this.name); console.log("6", this); }, 10); }, };
person.callName(); person.callName2();
|
綁定到其定義時所在的物件
,我們要了解一般函式在建立時是在 window 下,所以在 window 下使用箭頭函式自然會指向 window。
要確實將箭頭函式宣告在物件內部,這樣 this
才會指向該物件。
簡單來說,一般函數式是建立在window下,所以箭頭函式,會指向window。但是,若將箭頭函式先告在物件內部,就會指向物件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var func = function () { var func2 = function () { setTimeout(() => { console.log(this); }, 10); }; var func3 = { func: func2, var4: 4, }; func2(); func3.func(); };
func();
|
func()
是最外層的函式,他對於內層的箭頭不會有影響。
func2()
是包覆在內層的函式,但由於箭頭函式不是在物件內,所以沒有影響。
func3()
是呼叫在物件內的函式,因此箭頭函式會是使用它所在的物件。
因為物件func3
呼叫了函式func()
,所以箭頭函式會指向他func3
所使用所在的物件。
縮寫的方法
- 去除function
- 加上等號
- 宣告變數
- 增加箭頭
- 去除大括號
- 去除return
Arrow Function 1
1 2 3 4 5 6 7 8 9 10 11
| function sum(a,b){ return a+b; }
let sum2 = (a,b) =>{ return a+b; }
let sum3 = (a,b) => a+b
|
Arrow Function 2
1 2 3 4 5
| function isPositive(number){ return number >= 0; }
let isPositive2 = number => number >= 0
|
Arow Function 3
1 2 3 4 5 6
| function randomNumber(){ return Math.random }
let randomNumber2 = () => Math.random
|
Arrow Function4
1 2 3 4 5
| document.addEventListener('click',function(){ console.log('Click'); })
document.addEventListener = ('click',function() => console.log('Click'))
|
參考文章
JavaScript ES6 Arrow Functions Tutorial
鐵人賽:箭頭函式 (Arrow functions)