區(qū)別:1、箭頭函數(shù)的定義要比普通函數(shù)定義簡潔、清晰得多,很快捷;2、箭頭函數(shù)不會創(chuàng)建自己的this,而普通函數(shù)會;3、箭頭函數(shù)不能作為構(gòu)造函數(shù)使用,而箭頭函數(shù)能作為構(gòu)造函數(shù)使用;4、箭頭函數(shù)沒有自己的arguments,而箭頭函數(shù)有。
本教程操作環(huán)境:windows7系統(tǒng)、ECMAScript 6版、Dell G3電腦。
箭頭函數(shù)是前端面試環(huán)節(jié)的一個高頻考點,箭頭函數(shù)是ES6的API,相信很多人都知道,因為它的語法比一般的函數(shù)更簡潔,所以深受大家的喜愛。
一、基本語法
ES6中允許使用箭頭=>
來定義箭頭函數(shù),具體語法,我們來看一個簡單的例子:
// 箭頭函數(shù) let fun = (name) => { // 函數(shù)體 return `Hello ${name} !`; }; // 等同于 let fun = function (name) { // 函數(shù)體 return `Hello ${name} !`; };
可以看出,定義箭頭函在數(shù)語法上要比普通函數(shù)簡潔得多。箭頭函數(shù)省去了function
關(guān)鍵字,采用箭頭=>
來定義函數(shù)。函數(shù)的參數(shù)放在=>
前面的括號中,函數(shù)體跟在=>
后的花括號中。
關(guān)于箭頭函數(shù)的參數(shù):
① 如果箭頭函數(shù)沒有參數(shù),直接寫一個空括號即可。
② 如果箭頭函數(shù)的參數(shù)只有一個,也可以省去包裹參數(shù)的括號。
③ 如果箭頭函數(shù)有多個參數(shù),將參數(shù)依次用逗號(,)分隔,包裹在括號中即可。
// 沒有參數(shù) let fun1 = () => { console.log(111); }; // 只有一個參數(shù),可以省去參數(shù)括號 let fun2 = name => { console.log(`Hello ${name} !`) }; // 有多個參數(shù) let fun3 = (val1, val2, val3) => { return [val1, val2, val3]; };
關(guān)于箭頭函數(shù)的函數(shù)體:
① 如果箭頭函數(shù)的函數(shù)體只有一句代碼,就是簡單返回某個變量或者返回一個簡單的JS表達式,可以省去函數(shù)體的大括號{ }。
let f = val => val; // 等同于 let f = function (val) { return val }; let sum = (num1, num2) => num1 + num2; // 等同于 let sum = function(num1, num2) { return num1 + num2; };
② 如果箭頭函數(shù)的函數(shù)體只有一句代碼,就是返回一個對象,可以像下面這樣寫:
// 用小括號包裹要返回的對象,不報錯 let getTempItem = id => ({ id: id, name: "Temp" }); // 但絕不能這樣寫,會報錯。 // 因為對象的大括號會被解釋為函數(shù)體的大括號 let getTempItem = id => { id: id, name: "Temp" };
③ 如果箭頭函數(shù)的函數(shù)體只有一條語句并且不需要返回值(最常見是調(diào)用一個函數(shù)),可以給這條語句前面加一個void
關(guān)鍵字
let fn = () => void doesNotReturn();
箭頭函數(shù)最常見的用處就是簡化回調(diào)函數(shù)。
// 例子一 // 正常函數(shù)寫法 [1,2,3].map(function (x) { return x * x; }); // 箭頭函數(shù)寫法 [1,2,3].map(x => x * x); // 例子二 // 正常函數(shù)寫法 var result = [2, 5, 1, 4, 3].sort(function (a, b) { return a - b; }); // 箭頭函數(shù)寫法 var result = [2, 5, 1, 4, 3].sort((a, b) => a - b);
二、箭頭函數(shù)與普通函數(shù)的區(qū)別
1、語法更加簡潔、清晰
從上面的基本語法示例中可以看出,箭頭函數(shù)的定義要比普通函數(shù)定義簡潔、清晰得多,很快捷。
2、箭頭函數(shù)不會創(chuàng)建自己的this(重要??!深入理解?。。?/strong>
我們先來看看MDN上對箭頭函數(shù)this
的解釋。
箭頭函數(shù)不會創(chuàng)建自己的
this
,所以它沒有自己的this
,它只會從自己的作用域鏈的上一層繼承this
。
箭頭函數(shù)沒有自己的this
,它會捕獲自己在定義時(注意,是定義時,不是調(diào)用時)所處的外層執(zhí)行環(huán)境的this
,并繼承這個this
值。所以,箭頭函數(shù)中this
的指向在它被定義的時候就已經(jīng)確定了,之后永遠不會改變。
來看個例子:
var id = 'Global'; function fun1() { // setTimeout中使用普通函數(shù) setTimeout(function(){ console.log(this.id); }, 2000); } function fun2() { // setTimeout中使用箭頭函數(shù) setTimeout(() => { console.log(this.id); }, 2000) } fun1.call({id: 'Obj'}); // 'Global' fun2.call({id: 'Obj'}); // 'Obj'
上面這個例子,函數(shù)fun1
中的setTimeout
中使用普通函數(shù),2秒后函數(shù)執(zhí)行時,這時函數(shù)其實是在全局作用域執(zhí)行的,所以this
指向Window
對象,this.id
就指向全局變量id
,所以輸出'Global'
。
但是函數(shù)fun2
中的setTimeout
中使用的是箭頭函數(shù),這個箭頭函數(shù)的this
在定義時就確定了,它繼承了它外層fun2
的執(zhí)行環(huán)境中的this
,而fun2
調(diào)用時this
被call
方法改變到了對象{id: 'Obj'}
中,所以輸出'Obj'
。
再來看另一個例子:
var id = 'GLOBAL'; var obj = { id: 'OBJ', a: function(){ console.log(this.id); }, b: () => { console.log(this.id); } }; obj.a(); // 'OBJ' obj.b(); // 'GLOBAL'
上面這個例子,對象obj
的方法a
使用普通函數(shù)定義的,普通函數(shù)作為對象的方法調(diào)用時,this
指向它所屬的對象。所以,this.id
就是obj.id
,所以輸出'OBJ'
。
但是方法b
是使用箭頭函數(shù)定義的,箭頭函數(shù)中的this
實際是繼承的它定義時所處的全局執(zhí)行環(huán)境中的this
,所以指向Window
對象,所以輸出'GLOBAL'
。(這里要注意,定義對象的大括號{}
是無法形成一個單獨的執(zhí)行環(huán)境的,它依舊是處于全局執(zhí)行環(huán)境中??!)
3、箭頭函數(shù)繼承而來的this指向永遠不變(重要!!深入理解?。。?/strong>
上面的例子,就完全可以說明箭頭函數(shù)繼承而來的this
指向永遠不變。對象obj
的方法b
是使用箭頭函數(shù)定義的,這個函數(shù)中的this
就永遠指向它定義時所處的全局執(zhí)行環(huán)境中的this
,即便這個函數(shù)是作為對象obj
的方法調(diào)用,this
依舊指向Window
對象。
4、.call()/.apply()/.bind()無法改變箭頭函數(shù)中this的指向
.call()
/.apply()
/.bind()
方法可以用來動態(tài)修改函數(shù)執(zhí)行時this
的指向,但由于箭頭函數(shù)的this
定義時就已經(jīng)確定且永遠不會改變。所以使用這些方法永遠也改變不了箭頭函數(shù)this
的指向,雖然這么做代碼不會報錯。
var id = 'Global'; // 箭頭函數(shù)定義在全局作用域 let fun1 = () => { console.log(this.id) }; fun1(); // 'Global' // this的指向不會改變,永遠指向Window對象 fun1.call({id: 'Obj'}); // 'Global' fun1.apply({id: 'Obj'}); // 'Global' fun1.bind({id: 'Obj'})(); // 'Global'
5、箭頭函數(shù)不能作為構(gòu)造函數(shù)使用
我們先了解一下構(gòu)造函數(shù)的new都做了些什么?簡單來說,分為四步: ① JS內(nèi)部首先會先生成一個對象; ② 再把函數(shù)中的this指向該對象; ③ 然后執(zhí)行構(gòu)造函數(shù)中的語句; ④ 最終返回該對象實例。
但是??!因為箭頭函數(shù)沒有自己的this
,它的this
其實是繼承了外層執(zhí)行環(huán)境中的this
,且this
指向永遠不會隨在哪里調(diào)用、被誰調(diào)用而改變,所以箭頭函數(shù)不能作為構(gòu)造函數(shù)使用,或者說構(gòu)造函數(shù)不能定義成箭頭函數(shù),否則用new
調(diào)用時會報錯!
let Fun = (name, age) => { this.name = name; this.age = age; }; // 報錯 let p = new Fun('cao', 24);
6、箭頭函數(shù)沒有自己的arguments
箭頭函數(shù)沒有自己的arguments
對象。在箭頭函數(shù)中訪問arguments
實際上獲得的是外層局部(函數(shù))執(zhí)行環(huán)境中的值。
// 例子一 let fun = (val) => { console.log(val); // 111 // 下面一行會報錯 // Uncaught ReferenceError: arguments is not defined // 因為外層全局環(huán)境沒有arguments對象 console.log(arguments); }; fun(111); // 例子二 function outer(val1, val2) { let argOut = arguments; console.log(argOut); // ① let fun = () => { let argIn = arguments; console.log(argIn); // ② console.log(argOut === argIn); // ③ }; fun(); } outer(111, 222);
上面例子二,①②③處的輸出結(jié)果如下:
很明顯,普通函數(shù)outer
內(nèi)部的箭頭函數(shù)fun
中的arguments
對象,其實是沿作用域鏈向上訪問的外層outer
函數(shù)的arguments
對象。
可以在箭頭函數(shù)中使用rest參數(shù)代替arguments對象,來訪問箭頭函數(shù)的參數(shù)列表!!
7、箭頭函數(shù)沒有原型prototype
let sayHi = () => { console.log('Hello World !') }; console.log(sayHi.prototype); // undefined
8、箭頭函數(shù)不能用作Generator函數(shù),不能使用yeild關(guān)鍵字
【相關(guān)推薦:javascript視頻教程、web前端】
以上是es6中箭頭函數(shù)和普通函數(shù)的區(qū)別是什么的詳細內(nèi)容。更多信息請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣服圖片

Undresser.AI Undress
人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover
用于從照片中去除衣服的在線人工智能工具。

Clothoff.io
AI脫衣機

Video Face Swap
使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的代碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級代碼編輯軟件(SublimeText3)

WebSocket與JavaScript:實現(xiàn)實時監(jiān)控系統(tǒng)的關(guān)鍵技術(shù)引言:隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,實時監(jiān)控系統(tǒng)在各個領(lǐng)域中得到了廣泛的應用。而實現(xiàn)實時監(jiān)控的關(guān)鍵技術(shù)之一就是WebSocket與JavaScript的結(jié)合使用。本文將介紹WebSocket與JavaScript在實時監(jiān)控系統(tǒng)中的應用,并給出代碼示例,詳細解釋其實現(xiàn)原理。一、WebSocket技

如何使用WebSocket和JavaScript實現(xiàn)在線語音識別系統(tǒng)引言:隨著科技的不斷發(fā)展,語音識別技術(shù)已經(jīng)成為了人工智能領(lǐng)域的重要組成部分。而基于WebSocket和JavaScript實現(xiàn)的在線語音識別系統(tǒng),具備了低延遲、實時性和跨平臺的特點,成為了一種被廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現(xiàn)在線語音識別系

如何利用JavaScript和WebSocket實現(xiàn)實時在線點餐系統(tǒng)介紹:隨著互聯(lián)網(wǎng)的普及和技術(shù)的進步,越來越多的餐廳開始提供在線點餐服務。為了實現(xiàn)實時在線點餐系統(tǒng),我們可以利用JavaScript和WebSocket技術(shù)。WebSocket是一種基于TCP協(xié)議的全雙工通信協(xié)議,可以實現(xiàn)客戶端與服務器的實時雙向通信。在實時在線點餐系統(tǒng)中,當用戶選擇菜品并下單

JavaScript和WebSocket:打造高效的實時天氣預報系統(tǒng)引言:如今,天氣預報的準確性對于日常生活以及決策制定具有重要意義。隨著技術(shù)的發(fā)展,我們可以通過實時獲取天氣數(shù)據(jù)來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術(shù),來構(gòu)建一個高效的實時天氣預報系統(tǒng)。本文將通過具體的代碼示例來展示實現(xiàn)的過程。We

如何使用WebSocket和JavaScript實現(xiàn)在線預約系統(tǒng)在當今數(shù)字化的時代,越來越多的業(yè)務和服務都需要提供在線預約功能。而實現(xiàn)一個高效、實時的在線預約系統(tǒng)是至關(guān)重要的。本文將介紹如何使用WebSocket和JavaScript來實現(xiàn)一個在線預約系統(tǒng),并提供具體的代碼示例。一、什么是WebSocketWebSocket是一種在單個TCP連接上進行全雙工

JavaScript教程:如何獲取HTTP狀態(tài)碼,需要具體代碼示例前言:在Web開發(fā)中,經(jīng)常會涉及到與服務器進行數(shù)據(jù)交互的場景。在與服務器進行通信時,我們經(jīng)常需要獲取返回的HTTP狀態(tài)碼來判斷操作是否成功,根據(jù)不同的狀態(tài)碼來進行相應的處理。本篇文章將教你如何使用JavaScript獲取HTTP狀態(tài)碼,并提供一些實用的代碼示例。使用XMLHttpRequest

用法:在JavaScript中,insertBefore()方法用于在DOM樹中插入一個新的節(jié)點。這個方法需要兩個參數(shù):要插入的新節(jié)點和參考節(jié)點(即新節(jié)點將要被插入的位置的節(jié)點)。

JavaScript中的HTTP狀態(tài)碼獲取方法簡介:在進行前端開發(fā)中,我們常常需要處理與后端接口的交互,而HTTP狀態(tài)碼就是其中非常重要的一部分。了解和獲取HTTP狀態(tài)碼有助于我們更好地處理接口返回的數(shù)據(jù)。本文將介紹使用JavaScript獲取HTTP狀態(tài)碼的方法,并提供具體代碼示例。一、什么是HTTP狀態(tài)碼HTTP狀態(tài)碼是指當瀏覽器向服務器發(fā)起請求時,服務
