JavaScript 箭頭函數(shù)的特點、與普通函數(shù)的區(qū)別
1. 箭頭函數(shù)的使用
ES6 中新增了使用箭頭=>
來定義函數(shù)表達式的方法。很多情況下,箭頭函數(shù)和函數(shù)表達式創(chuàng)建的函數(shù)并無區(qū)別,只有寫法上的不同。
本文第二塊內(nèi)容將介紹箭頭函數(shù)和普通函數(shù)功能上的區(qū)別。
1. 普通函數(shù)到箭頭函數(shù)
如下所示,定義一個函數(shù),可以使用function
關(guān)鍵字,函數(shù)接收兩個參數(shù)a
和b
,返回a
和b
的和。
function getSum(a, b) { return a + b; }
若使用箭頭函數(shù)來定義這個函數(shù),可以寫成如下形式,省略function
關(guān)鍵字,用箭頭=>
定義一個函數(shù)。
const getSum = (a, b) => { return a + b; };
2. 省略大括號和 return
若定義的箭頭函數(shù),函數(shù)體內(nèi)只有return
語句,則可以省略大括號{}
和return
。
如下所示,定義的箭頭函數(shù),完整寫法。
const getSum = (a, b) => { return a + b; };
此箭頭函數(shù)的函數(shù)體內(nèi)只有return
語句,那么,省略了大括號{}
和return
后的精簡寫法如下:
const getSum = (a, b) => a + b;
3. 省略小括號
若定義的箭頭函數(shù),參數(shù)只有一個,則可以省略小括號。
如下所示,定義的箭頭函數(shù),只有一個參數(shù),完整寫法。
const func = (a) => { return a + 2; };
省略了參數(shù)旁邊的小括號,以下代碼等價于上面的代碼。
const func = a => a + 2;
注意:若函數(shù)沒有參數(shù),或者多個參數(shù)的情況下,必須要使用括號。
2. 箭頭函數(shù)與普通函數(shù)的區(qū)別
大多數(shù)情況下,能使用普通函數(shù)的地方都可以用箭頭函數(shù)代替,因為箭頭函數(shù)更精簡。
但在部分情況下,箭頭函數(shù)與普通函數(shù)有著很大的卻別。
1. 箭頭函數(shù)的 this 是父級作用域的 this
如下代碼,定義了一個對象obj
,對象中有個普通函數(shù)定義的方法getThis
,打印出此處的this
。調(diào)用obj.getThis()
,會打印出obj
對象。這說明方法內(nèi)部的this
指向?qū)ο?code>obj。
const obj = { name: 'Jack', getThis() { console.log(this); }, }; obj.getThis(); // {name: 'Jack', getThis: ƒ}
同樣定義一個對象obj
,但里面的方法用箭頭函數(shù)定義,瀏覽器中調(diào)用obj.getThis()
卻打印出Window
,這說明即使調(diào)用obj
對象身上的方法,方法內(nèi)部的this
也不會指向obj
,而是指向定義obj
的上下文的this
。
const obj = { name: 'Jack', getThis: () => { console.log(this); }, }; obj.getThis(); // Window
2. call、apply、bind無法改變箭頭函數(shù)的 this
如下代碼,普通函數(shù)getName
打印this.name
,通過call
將函數(shù)中的this
綁定到obj
身上,調(diào)用getName
打印出obj
身上的屬性name
。
const obj = { name: 'Jack', }; function getName() { console.log(this.name); } getName.call(obj); // Jack
若將函數(shù)改成箭頭函數(shù),那么call
將不起作用,無法將函數(shù)內(nèi)部的this
綁定到obj
,打印出undefined
。
const obj = { name: 'Jack', }; const getName = () => { console.log(this.name); }; getName.call(obj); // undefined
3. 不可以作為構(gòu)造函數(shù)
箭頭函數(shù)不可以作為構(gòu)造函數(shù)使用,若將箭頭函數(shù)作為構(gòu)造函數(shù),將報錯,如下代碼所示。
const Person = () => { this.name = 'Jack'; }; const usr = new Person(); // Person is not a constructor
4. 不可以使用 arguments
在普通函數(shù)內(nèi)部,可以使用arguments
來獲取傳入的參數(shù),是一個類數(shù)組對象:
function func() { console.log(arguments); } func(1, 2, 3); // [Arguments] { '0': 1, '1': 2, '2': 3 }
而箭頭函數(shù)就不可以使用arguments
對象,獲取不到輸入的參數(shù)。
在瀏覽器中,若在箭頭函數(shù)使用arguments
對象,將報錯。
const func = () => { // 瀏覽器環(huán)境 console.log(arguments); // arguments is not defined }; func(1, 2, 3);
但是箭頭函數(shù)可以在參數(shù)內(nèi),以...args
的方式,獲取到輸入的參數(shù),得到的args
是一個數(shù)組。
const func = (...args) => { console.log(args); // [ 1, 2, 3 ] }; func(1, 2, 3);
5. 箭頭函數(shù)不支持 new.target
普通函數(shù)定義的構(gòu)造函數(shù)內(nèi)部,支持使用new.target
,返回構(gòu)造實例的構(gòu)造函數(shù)。
function Person() { this.name = 'Jack'; console.log(new.target); } // 指向構(gòu)造函數(shù) new Person(); // [Function: Person]
而在箭頭函數(shù)中,不支持使用new.target
。在瀏覽器環(huán)境中,箭頭函數(shù)使用new.target
將報錯:new.target expression is not allowed here
。
const Person=() =>{ this.name = 'Jack'; console.log(new.target); } // 瀏覽器環(huán)境 new Person(); // new.target expression is not allowed here
本文參考:
《JavaScript高級程序設(shè)計(第4版)》
到此這篇關(guān)于JavaScript 箭頭函數(shù)的特點、與普通函數(shù)的區(qū)別的文章就介紹到這了,更多相關(guān)js箭頭函數(shù)普通函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
js字符串截取函數(shù)substr substring slice使用對比
字符串截取函數(shù)有substr、substring以及slice等等,下面將為大家介紹下各自的使用,感興趣的朋友可以了解下2013-11-11javascript 10進制和62進制的相互轉(zhuǎn)換
本節(jié)主要介紹了javascript 10進制和62進制的相互轉(zhuǎn)換,需要的朋友可以參考下2014-07-07tsc性能優(yōu)化Project References使用詳解
這篇文章主要為大家介紹了tsc性能優(yōu)化Project References使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11