JavaScript箭頭函數(shù)與普通函數(shù)的具體區(qū)別詳細(xì)解析
前言
在 JavaScript 中,箭頭函數(shù)(Arrow Function) 是 ES6 引入的一種新的函數(shù)寫(xiě)法。它不僅簡(jiǎn)化了函數(shù)的定義方式,還在作用域綁定、this 指向等方面帶來(lái)了顯著差異。
一、一句話(huà)總結(jié)
箭頭函數(shù)比普通函數(shù)更簡(jiǎn)潔,沒(méi)有自己的
this、arguments、prototype,也不可以作為構(gòu)造函數(shù)使用;它的this是詞法作用域繼承來(lái)的,一旦確定就不會(huì)改變。
二、具體區(qū)別對(duì)比表
| 特性 | 普通函數(shù) | 箭頭函數(shù) |
|---|---|---|
是否有 this 綁定 | ? 有自己的 this | ? 沒(méi)有,繼承外層作用域的 this |
| 是否可以作為構(gòu)造函數(shù) | ? 可以 | ? 不可以(不能用 new) |
是否有 arguments 對(duì)象 | ? 有 | ? 沒(méi)有(可用 ...args 替代) |
是否有 prototype 屬性 | ? 有 | ? 沒(méi)有 |
| 是否支持簡(jiǎn)寫(xiě)語(yǔ)法 | ? 否 | ? 是(參數(shù)和返回值可省略括號(hào)/大括號(hào)) |
this 是否可變 | ? 可變(運(yùn)行時(shí)綁定) | ? 固定(詞法作用域綁定) |
三、詳細(xì)解析
更加簡(jiǎn)潔的語(yǔ)法
無(wú)參數(shù):
const sayHello = () => console.log('Hello');單個(gè)參數(shù)(可省略括號(hào)):
const square = x => x * x;
多個(gè)參數(shù)(必須加括號(hào)):
const add = (a, b) => a + b;
返回值單行表達(dá)式(可省略{}和return):
const double = x => x * 2;
執(zhí)行副作用語(yǔ)句(使用void避免隱式返回):
const fn = () => void someFunction(); // 防止返回值污染
沒(méi)有自己的this
這是箭頭函數(shù)最核心的特點(diǎn)之一。
- 普通函數(shù)中的 this 是動(dòng)態(tài)的,根據(jù)調(diào)用方式不同而變化;
- 箭頭函數(shù)中的 this 是詞法作用域繼承的,即定義時(shí)就決定了,不會(huì)隨調(diào)用方式改變;
示例說(shuō)明:
var id = 'GLOBAL';
var obj = {
id: 'OBJ',
a: function() {
console.log(this.id);
},
b: () => {
console.log(this.id);
}
};
obj.a(); // 'OBJ' (this 指向 obj)
obj.b(); // 'GLOBAL'(this 指向外層 window/global)
new obj.a(); // this 指向新對(duì)象,輸出 undefined(因?yàn)樾聦?duì)象沒(méi)有 id)
new obj.b(); // 報(bào)錯(cuò):Uncaught TypeError: obj.b is not a constructor?? 結(jié)論:
a()是普通函數(shù),其this根據(jù)調(diào)用者動(dòng)態(tài)綁定;b()是箭頭函數(shù),this指向定義時(shí)的外層上下文(全局作用域);- 箭頭函數(shù)不能作為構(gòu)造函數(shù),所以不能用
new調(diào)用;
沒(méi)有arguments對(duì)象
箭頭函數(shù)內(nèi)部無(wú)法使用 arguments,但可以通過(guò) ...args 獲取所有參數(shù)。
示例:
const logArgs = (...args) => {
console.log(args);
};
logArgs(1, 2, 3); // [1, 2, 3]沒(méi)有prototype屬性
function Foo() {}
console.log(Foo.prototype); // {constructor: ...}
const Bar = () => {};
console.log(Bar.prototype); // undefined因?yàn)榧^函數(shù)不能作為構(gòu)造函數(shù),自然也沒(méi)有原型屬性。
不能作為構(gòu)造函數(shù)(不可new)
const Person = () => {};
const p = new Person(); // TypeError: Person is not a constructor四、應(yīng)用場(chǎng)景建議
| 場(chǎng)景 | 推薦使用 | 原因 |
|---|---|---|
方法或回調(diào)中需要綁定 this | ? 箭頭函數(shù) | 自動(dòng)繼承外層 this,避免 .bind(this) 或保存 that = this |
| 構(gòu)造函數(shù)、類(lèi)方法 | ? 箭頭函數(shù) ? 普通函數(shù) | 箭頭函數(shù)不能作為構(gòu)造函數(shù),也無(wú)法綁定 this 到實(shí)例 |
需要 arguments 的場(chǎng)景 | ? 箭頭函數(shù) ? 普通函數(shù)(或使用 ...args) | 箭頭函數(shù)不支持 arguments |
需要 prototype 的場(chǎng)景 | ? 箭頭函數(shù) ? 普通函數(shù) | 箭頭函數(shù)沒(méi)有 prototype |
五、一句話(huà)總結(jié)
箭頭函數(shù)是現(xiàn)代 JavaScript 中非常實(shí)用的語(yǔ)法糖,適合用于不需要自身
this、arguments或構(gòu)造功能的場(chǎng)景。但在需要構(gòu)造函數(shù)、動(dòng)態(tài)this或訪(fǎng)問(wèn)arguments的情況下,應(yīng)優(yōu)先使用普通函數(shù)。
進(jìn)階建議
- 在 Vue / React 中,組件方法推薦使用箭頭函數(shù)自動(dòng)綁定
this; - 使用 TypeScript 可以幫助你更好地理解函數(shù)類(lèi)型和
this的指向; - 使用 ESLint 規(guī)則防止誤將箭頭函數(shù)當(dāng)作構(gòu)造函數(shù)使用;
- 結(jié)合
class使用箭頭函數(shù)字段,可以自動(dòng)綁定this(如class MyClass { myMethod = () => {} });
到此這篇關(guān)于JavaScript箭頭函數(shù)與普通函數(shù)的具體區(qū)別詳細(xì)解析的文章就介紹到這了,更多相關(guān)js箭頭函數(shù)與普通函數(shù)的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- JavaScript中的普通函數(shù)和箭頭函數(shù)的區(qū)別和用法詳解
- 深入理解JavaScript中的箭頭函數(shù)
- JS 箭頭函數(shù)的this指向詳解
- JavaScript箭頭函數(shù)中的this詳解
- 深入理解Javascript箭頭函數(shù)中的this
- javascript ES6中箭頭函數(shù)注意細(xì)節(jié)小結(jié)
- JS中箭頭函數(shù)與this的寫(xiě)法和理解
- 深入理解JavaScript 箭頭函數(shù)
- JavaScript ES6箭頭函數(shù)使用指南
- 一文帶你掌握J(rèn)avaScript中的箭頭函數(shù)
相關(guān)文章
JavaScript日期時(shí)間格式化函數(shù)分享
這篇文章主要介紹了JavaScript日期時(shí)間格式化函數(shù)分享,需要的朋友可以參考下2014-05-05
基于JS+Canvas的lucky-canvas?抽獎(jiǎng)功能
一個(gè)基于?Js?+?Canvas?的大轉(zhuǎn)盤(pán)和九宮格和老虎機(jī)抽獎(jiǎng),使用lucky-canvas?功能可以自由配置,多端適配的特點(diǎn),本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹抽獎(jiǎng)方法,感興趣的朋友一起看看吧2022-06-06
跨域請(qǐng)求兩種方法 jsonp和cors的實(shí)現(xiàn)
這篇文章主要介紹了跨域請(qǐng)求兩種方法 jsonp和cors的實(shí)現(xiàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
生成html靜態(tài)文件后的分頁(yè)(客戶(hù)端版)
生成html靜態(tài)文件后的分頁(yè)(客戶(hù)端版)...2006-07-07
Javascript中prototype與__proto__的關(guān)系詳解
這篇文章主要給大家介紹了關(guān)于Javascript中prototype與__proto__的關(guān)系的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03
JS中onpropertychange和onchange事件區(qū)別小結(jié)
當(dāng)一個(gè)HTML元素的屬性用js改變的時(shí)候,都能通過(guò)onpropertychange來(lái)捕獲。例如一個(gè)文本text對(duì)象的value屬性被頁(yè)面的腳本修改的時(shí)候,onchange無(wú)法捕獲到,而onpropertychange卻能夠捕獲。2010-07-07

