JavaScript 箭頭函式
既然稱作箭頭函式,可以猜想,函式的構成可能與箭頭相關。
事實也是如此,看一段簡單程式碼例項:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = arg => arg; console.log(func(5));
程式碼執行效果截圖如下:
上面是一個簡單箭頭函式的執行演示,傳遞引數,並返回引數本身。
先總結大致總結一下箭頭函式的特點,然後再一一通過程式碼例項演示。
特點如下:
(1).通過=>箭頭定義。
(2).箭頭函式都是匿名函式。
(3).函式中this與普通函式相比發生很大變化。
(4).箭頭函式不能用作建構函式。
(5).箭頭函式不能用作Generator函式。
一.使用箭頭定義函式:
重複一下前面的程式碼:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = arg => arg; console.log(func(5));
程式碼分析如下:
(1).箭頭的左側是給函式傳遞的引數,是否需要小括號後面介紹。
(2).箭頭的右側是函式體,可以省略大括號,不過是有條件的。
(3).函式返回值為5,但沒有使用return語句,後面具體分析。
上面對箭頭函式進行了一些總結分析,並提出了一些問題,下面做一下解答。
小括號是否可以省略:
箭頭函式沒有引數或者具有多個引數,引數部分必須使用小括號。
[JavaScript] 純文字檢視 複製程式碼let func = arg => arg;
上面程式碼只有一個引數,小括號可以省略。
[JavaScript] 純文字檢視 複製程式碼let func = () => 5;
箭頭函式如果沒有規定引數,小括號不能省略。
[JavaScript] 純文字檢視 複製程式碼let func = (x, y) => x + y;
箭頭函式如果規定多個引數,小括號不能省略。
函式體大括號是否可以省略:
=>箭頭右側是函式體,如果函式體中有多條語句,那必須使用大括號包裹。
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = (a, b) => { let num=a+b; return num; } console.log(func(3,4));
上面的程式碼中,箭頭函式的函式體具有多條語句,那麼函式體必須使用大括號包裹。
是否使用return語句返回值:
如果函式體使用大括號包裹,那麼返回值必須使用return語句。
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = arg => arg; console.log(func(5));
程式碼執行效果截圖如下:
上面程式碼沒有使用大括號包裹函式體,這時候正常返回值。
如果使用大括號包裹函式體,那麼如果想要返回值,則必須使用return語句。
程式碼修改如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = arg => { return arg }; console.log(func(5));
程式碼執行效果截圖如下:
二.箭頭函式一些其他特性:
如果返回一個字面量,需要用小括號將其包裹,或者使用大括號包裹。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = () => ({webName:"螞蟻部落"}) console.log(func().webName);
不包裹,那麼大括號就會被解析為函式體的大括號。
也可以使用如下程式碼:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = () => {return {webName:"螞蟻部落"}} console.log(func().webName);
箭頭函式也可以使用解構賦值,程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = ([webName,age=4]) => [webName,age]; console.log(func(["螞蟻部落",6]));
程式碼執行效果截圖如下:
關於函式結構賦值可以參閱JavaScript 函式引數解構賦值一章節。
箭頭函式也可以使用剩餘運算子,程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = (a,...rest) => rest console.log(func(1,2,3,4,5));
程式碼執行效果截圖如下:
關於剩餘運算子可以參閱JavaScript剩餘運算子一章節。
三.箭頭函式中this指向:
普通函式中this的指向可以參閱JavaScript this用法詳解一章節。
箭頭函式中的this指向與普通函式的this相比已經發生了本質的變化。
箭頭函式本身沒有this,但是在它宣告的時候,能夠捕獲此函式所在作用域中this。
捕獲成功後,this指向的物件始終保持不變。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let url = "softwhy.com"; function Antzone(){ this.url = "www.softwhy.com"; let func=() => { console.log(this.url); } func(); } let antzone = new Antzone();
程式碼執行效果截圖如下:
程式碼分析如下:
(1).使用new呼叫建構函式時,會進入此函式作用域。
(2).此作用域中的this指向物件例項antzone。
(3).箭頭函式是在建構函式執行時宣告,這時就會捕獲這個this。
(4).這個this是指向物件例項antzone的,所以箭頭函式呼叫返回值就是"www.softwhy.com"。
[JavaScript] 純文字檢視 複製程式碼執行程式碼var url = "softwhy.com"; function Antzone(){ let func=() => { console.log(this.url); } func(); } Antzone();
程式碼執行效果截圖如下:
程式碼分析如下:
(1).Antzone作為一個普通函式執行。
(2).它執行的時候會建立函式作用域,此作用域中this指向全域性物件window。
(3).那麼箭頭函式就會捕獲這個this。
(4).最終列印結果是"softwhy.com"。
由於箭頭函式本身沒有this,且宣告時捕獲this後,不再發生改變,所以常見的改變this指向的操作會失效,比如利用call、apply或者bind方法。
四.箭頭函式沒有arguments物件:
關於arguments物件可以參閱JavaScript arguments物件詳解一章節。
但是箭頭函式沒有此物件,程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼執行程式碼let func = arg =>{ console.log(arguments[0]); } func(5);
程式碼執行效果截圖如下:
由此可見箭頭函式並沒有arguments物件。
箭頭函式還具有如下特點:
(1).文章開頭已經介紹箭頭函式不能用作建構函式和Generator函式。
(2).箭頭函式不能用作建構函式,那麼也就沒有prototype屬性。
這裡不再演示,感興趣的可以自行測試一下,如果實在懶惰,那麼直接記住結論即可。
相關文章
- JavaScript(ES6)—箭頭函式JavaScript函式
- 箭頭函式函式
- TypeScript 箭頭函式TypeScript函式
- JS箭頭函式JS函式
- 箭頭函式中的this函式
- 有關箭頭函式函式
- 箭頭函式詳解函式
- 箭頭函式與普通函式區別函式
- 箭頭函式this指向詳解函式
- 箭頭函式this指向的陷阱函式
- ES6箭頭函式函式
- 箭頭函式的this指向(二)函式
- javascript中的this使用場景以及箭頭函式中的thisJavaScript函式
- 箭頭函式與普通函式的區別函式
- # 普通函式和箭頭函式的區別函式
- 從settTimeout到匿名函式、箭頭函式之() => {}函式
- 箭頭函式、簡寫函式、普通函式的區別函式
- javascript基礎修煉(8)——指向FP世界的箭頭函式JavaScript函式
- JS中的箭頭函式與thisJS函式
- 2020-10-18 箭頭函式函式
- 簡述箭頭函式和普通函式的區別函式
- 箭頭函式和普通函式的10個區別函式
- 詳解箭頭函式和普通函式的區別以及箭頭函式的注意事項、不適用場景函式
- ES6 箭頭函式(arrow function)函式Function
- ES6箭頭函式總結函式
- ES6 系列之箭頭函式函式
- react裡面bind與箭頭函式React函式
- PHP 7.4 新特性之箭頭函式PHP函式
- PHP 7.4 新語法:箭頭函式PHP函式
- PHP 7.4 新特性 —— 箭頭函式 2.0PHP函式
- ES6箭頭函式的使用函式
- Day 59/100 箭頭函式和普通函式的區別函式
- 面試題:箭頭函式和普通函式的區別面試題函式
- ES6 箭頭函式下的this指向函式
- ES 6 中的箭頭函式及用法函式
- javaES6箭頭函式的全新特性Java函式
- 【進階3-2期】JavaScript深入之重新認識箭頭函式的thisJavaScript函式
- 深入理解箭頭函式和傳統函式的區別函式