它是 ES6 標準裡其中非常受歡迎的新語法,允許使用 =>(箭頭) 來定義函數,比起一般函數可以用更簡短的語法來表示,可以讓程式碼的可閱讀性提高。
1 2 3 4 5 6 7 8 let circleArea = function (r ) { return r * r * 3.14 ; } let circleArea = r => r * r * 3.14 ;circleArea(10 );
使用特性
擁有匿名函數 (anonymous function) 的特性
若無參數 或有多個參數 ,需要在參數部分加上括號()
1 2 3 4 5 6 7 8 let greeting = () => 'Hello' ;let add = (n1, n2 ) => n1 + n2;console .log(greeting()); console .log(add(10 , 20 ));
若返回值或參數有包含{},像是物件內容 ,需要在外圍加上括號()
1 2 3 4 5 let foo = () => ({x : 10 , y : 20 });let foo2 = ({x, y} ) => x + y;console .log(foo()); console .log(foo2({x : 1 , y : 2 }));
若箭頭後面的程式區塊是陳述式 或多條語句 ,需要加上大括號{}
1 2 3 4 5 6 let getDate = () => { let date = new Date (); return date.toISOString().substr(0 , 10 ); } console .log(getDate());
非常適合簡化回調函數 (callback function)
1 2 3 4 let arr = [1 , 2 , 3 ];arr.map(num => num * 10 ); console .log(arr);
箭頭函數也跟一般函數一樣,參數可以有預設值、解構賦值、rest 參數 的功能
另外箭頭函數中沒有 arguments 物件,需要使用 rest 參數代替
綁定 this
原本一般函數裡的 this 物件的指向是可變的,會隨著外層運作的函數而改變
但是在箭頭函數中,它會變成固定的 ,this 會被綁定在當時”所定義的作用域中 “,而不會隨著環境改變成指向”運作時的作用域中 “
1 2 3 4 5 6 7 8 9 10 11 12 13 var button = document .querySelector('button' );var fn_arrow = () => { console .log(this .constructor.name); }; var fn = function ( ) { console .log(this .constructor.name); }; button.addEventListener('click' , fn_arrow); button.addEventListener('click' , fn);
上面程式範例參考來自: https://pjchender.blogspot.tw/2017/01/es6-arrow-function.html
下面另一個例子,箭頭函數會綁定外層定義的 this 物件,而一般函數則會指向正在運作自己的函數
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 function Timer ( ) { this .s1 = 0 ; this .s2 = 0 ; setInterval(() => this .s1++, 100 ); setInterval(function ( ) { this .s2++; }, 100 ); } const timer = new Timer();setTimeout(() => console .log('s1: ' , timer.s1), 350 ); setTimeout(() => console .log('s2: ' , timer.s2), 350 );
由於箭頭函數的 this 已經被綁定住了,所以不能使用函數的 call()、apply()、bind() 這些方法去改變 this 的指向
1 2 3 4 5 6 7 8 9 10 11 12 let people = { name: 'Bob' } const fn_arrow = () => { console .log(this ); } const fn = function ( ) { console .log(this ); } fn_arrow.call(people); fn.call(people);
好處
編寫內層函數想取用外層的 this 物件時,可以省略 var self = this 此步驟而直接使用了
解決了在建立內層函數或填入回調函數時的,裡面的 this 可能會指向全域物件 window 的問題
不可使用箭頭函數的情況
DOM 在處理監聽事件addEventListener()時,放入的回調函數 盡量不要使用箭頭函數
因為 this 不會隨著監聽事件所操作的 DOM 物件而改變
定義物件屬性中的方法 ,或者定義建構函數的 prototype方法 ,不能使用箭頭函數來定義
因為 this 不會指向物件或建構函數本身,而是全域物件 window 或是外層的作用域(函數)
定義建構函數 ,一樣不能使用箭頭函數來定義
因為在定義完後,只要使用new產生此建構的物件就會報錯