JavaScript Arror function
Arrow function
有什麼特性
- 箭頭函式本身沒有 this
- 意思就是說,箭頭函數不會創造一個新的 this,而是從它的外圍作用域一併抓起
- 箭頭函式 this 代表的是 function 執行時所屬的物件(function在外,function爸爸)
- 在箭頭函數中,this 綁定定義時的作用域,而不是指向運行時所在的作用域
- 只能用在匿名函式
- 隱式回傳(內建return)
- 箭頭函數使得 this 從 “動態” 變成 “靜態”
作用域
- 箭頭函数的 this 綁定定義時所在的作用域(即 Timer 函數)
- 普通函数的 this 指向運行時所在的作用域(即 window)
1 | function Timer() { |
判斷
- ( ) => 表示該變量存儲一個函數
1 | function() === ()=> |
- 只有一個參數時,括號才能不加
1 | (singleParam) => { statements } |
- 若無參數,就一定要加括號
1 | () => { statements } |
- 簡化 callback function
1 | [1,2,3].map(x => x * 2) |
- 沒用 花括號 ({}) 也只能在一行的語句的時候使用,會自動加 return
- 使用 花括號 ({}) 可以加入多行的語句,return 不會自動加,需要自己加上否則得到 undefined
1 | let funcA = x => x + 1 |
可使用的情況
- 用 箭頭函式 取出內層(return) myString 參數 (一般要用 隱式綁定)
1 | var myString = 'hello global', |
不可使用的情況
- 函式物件中的call、apply、bind,無法“覆蓋”箭頭函式中的 this 值(本身沒有 this)
1 | (function() { |
- 箭頭函式無法用於建構式 constructor,使用 new 會產生錯誤
1 | function MyCat(name) { |
- 箭頭函式沒有一般函式有的 arguments,如果要可以用 spread 代替
1 | function foo(...a) { |
- this 如果是用在監聽 DOM 上一樣會指向 window,所以無法使用在此情境
1 | var elements = document.getElementsByTagName('div'); |
- 在物件的 prototype 屬性中定義的方法 this 會指向 window
1 | function MyCat(name) { |
- 箭頭函式不能當作 generators 函數使用,使用 yield 會產生錯誤
- 箭頭函式用於解決一般的 this 問題是可以,但並不適用於全部的情況