成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

JavaScript 箭頭函數(shù):適用與不適用場景

瀏覽:152日期:2023-11-10 10:59:15

現(xiàn)代 JavaScript 中最引人注目的功能之一是引入了箭頭函數(shù),用 => 來標識。

這種函數(shù)有兩大優(yōu)點 – 非常簡潔的語法,和更直觀的作用域和 this的綁定。

這些優(yōu)點有時導致箭頭函數(shù)比其他形式的函數(shù)聲明更受歡迎。

例如,受歡迎的 airbnb eslint 配置 會在您創(chuàng)建匿名函數(shù)時強制使用JavaScript箭頭函數(shù)。

然而,就像工程中的任何東西一樣,箭頭函數(shù)優(yōu)點很明顯,同時也帶來了一些負面的東西。 使用他們的時候需要權衡一下。

學習如何權衡是更好地使用箭頭函數(shù)的關鍵。

在本文中,我們將首先回顧箭頭函數(shù)的工作原理,然后深入研究箭頭函數(shù)改進代碼的示例,最后深入研究箭不建議使用頭函數(shù)的示例。

JavaScript 箭頭函數(shù)究竟是什么?

JavaScript 箭頭函數(shù)大致相當于 python 中的 lambda 函數(shù) 或 Ruby 中的 blocks。

這些是匿名函數(shù),它們有自己的特殊語法,接受一定數(shù)量的參數(shù),并在其封閉的作用域的上下文(即定義它們的函數(shù)或其他代碼)中操作。

讓我們依次分解這些部分。

箭頭函數(shù)語法

箭頭函數(shù)具有單一的總體結構,然后在特殊情況下可以通過多種方式簡化它們。 核心結構如下所示:

(argument1, argument2, ... argumentN) => { // function body}

括號內(nèi)的是參數(shù)列表,后跟“胖箭頭”(=>),最后是函數(shù)體。

這與傳統(tǒng)函數(shù)非常相似,我們只是省略 function 關鍵字并在參數(shù)后添加一個胖箭頭(=>)。

然而,有許多方法可以簡化箭頭函數(shù)。

首先,如果函數(shù)體是單個表達式,則可以不使用花括號并將其置于內(nèi)聯(lián)中(省略大括號直接將表達式寫在一行中)。 表達式的結果將由函數(shù)返回。 例如:

const add = (a, b) => a + b;

其次,如果只有一個參數(shù),你甚至可以省略參數(shù)的括號。例如:

const getFirst = array => array[0];

正如您所看到的,這是一些非常簡潔的語法,我們將重點介紹后面的好處。

高級語法

有一些高級語法可以了解一下。

首先,如果您嘗試使用內(nèi)聯(lián)單行表達式語法,但您返回的值是對象字面量。您可能會認為這看起來應該是這樣的:

(name, description) => {name: name, description: description};

問題是這種語法比較含糊不清,容易引起歧義 : 看起來好像你正試圖創(chuàng)建一個傳統(tǒng)的函數(shù)體。 如果你碰巧想要一個對象的單個表達式,請用括號包裹該對象:

(name, description) => ({name: name, description: description});封閉的上下文作用域

與其他形式的函數(shù)不同,箭頭函數(shù)沒有自己的 執(zhí)行期上下文。

實際上,這意味著 this 和 arguments 都是從它們的父函數(shù)繼承而來的。

例如,使用和不使用箭頭函數(shù)比較以下代碼:

const test = { name: ’test object’, createAnonFunction: function() { return function() { console.log(this.name); console.log(arguments); }; }, createArrowFunction: function() { return () => { console.log(this.name); console.log(arguments); }; }};

我們有一個簡單的 test 對象,有兩個方法 – 每個方法都返回一個匿名函數(shù)。

不同之處在于第一個方法使用傳統(tǒng)函數(shù)表達式,而后者中使用箭頭函數(shù)。

如果我們使用相同參數(shù),在控制臺中運行它們,我們會得到完全不一樣的結果。

> const anon = test.createAnonFunction(’hello’, ’world’);> const arrow = test.createArrowFunction(’hello’, ’world’); > anon();undefined{} > arrow();test object{ ’0’: ’hello’, ’1’: ’world’ }

第一個匿名函數(shù)有自己的函數(shù)上下文,因此當您調(diào)用它時,test 對象的 this.name 沒有可用的引用,也沒有創(chuàng)建它時調(diào)用的參數(shù)。

另一個,箭頭函數(shù)具有與創(chuàng)建它的函數(shù)完全相同的函數(shù)上下文,使其可以訪問 argumetns 和 test 對象。

使用箭頭函數(shù)改進您的代碼

傳統(tǒng) lambda 函數(shù)的主要用例之一,就是用于遍歷列表中的項,現(xiàn)在用 JavaScript 箭頭函數(shù)實現(xiàn)。

比如你有一個有值的數(shù)組,你想去 map 遍歷每一項,這時使用箭頭函數(shù)非常理想:

const words = [’hello’, ’WORLD’, ’Whatever’];const downcasedWords = words.map(word => word.toLowerCase());

一個非常常見的例子是提取對象中的某個特定值:

const names = objects.map(object => object.name);

類似地,當用現(xiàn)代迭代樣式取代傳統(tǒng)的 for 循環(huán),一般我們使用 forEach 循環(huán),箭頭函數(shù)能夠保持 this 來自于父級,讓他們非常直觀

類似的,當用 forEach 來替換傳統(tǒng) for循環(huán)的時候,實際上箭頭函數(shù)會直觀的保持 this來自于父一級

this.examples.forEach(example => { this.runExample(example);});Promises 和 Promise 鏈

箭頭函數(shù)的另一個可以使代碼更清晰,更直觀的地方是管理異步代碼。

Promises 使得管理異步代碼變得容易很多(即使你很歡快地使用 async / await,你仍然應該理解 async / await 是建立在 Promises 之上的 ?。?/p>

但是,雖然使用 promises 仍然需要定義在異步代碼或調(diào)用完成后運行的函數(shù)。

這是箭頭函數(shù)的理想位置,特別是如果您生成的函數(shù)是有狀態(tài)的,同時想引用對象中的某些內(nèi)容。 例如:

this.doSomethingAsync().then((result) => { this.storeResult(result);});對象轉(zhuǎn)換

箭頭函數(shù)的另一個常見且極其強大的用途是封裝對象轉(zhuǎn)換。

例如,在 Vue.js 中,有一種通用模式,用于使用 mapState 將 Vuex 存儲的各個部分直接包含到 Vue 組件中。

這涉及定義一組 “mappers” ,這些 “mappers” 將從原始的完整的 state 對象轉(zhuǎn)換為提取所涉及組件所需的內(nèi)容。

這些簡單的轉(zhuǎn)換使用箭頭函數(shù)再合適不過了。比如:

export default { computed: { ...mapState({ results: state => state.results, users: state => state.users, }); }}你不應該使用箭頭函數(shù)的情景

在許多情況下,使用箭頭函數(shù)不是一個好主意。 他們不僅不會幫助你,而且會給你帶來一些不必要的麻煩。

第一個是對象的方法。 這是一個函數(shù)上下文的例子,這對于我們理解很有幫助。

有一段時間使用 Class(類)屬性語法和箭頭函數(shù)的組合,作為創(chuàng)建“自動綁定方法”的方式,例如, 事件處理程序可以使用,但仍然綁定到類的方法。

這看起來像是這樣的:

class Counter { counter = 0; handleClick = () => { this.counter++; }}

這樣,即使 handleClick 由事件處理程序調(diào)用,而不是在 Counter 實例的上下文中調(diào)用,它仍然可以訪問實例的數(shù)據(jù)。

這種方法的缺點很多,在本文中很好地記錄。

雖然使用這種方法確實為您提供了具有綁定函數(shù)的快捷方式,但該函數(shù)以多種不直觀的方式運行,如果您嘗試將此對象作為原型進行子類化/使用,則會不利于測試,同時也會產(chǎn)生很多問題。

相反,使用常規(guī)函數(shù),如果需要,將其綁定到構造函數(shù)中的實例:

class Counter { counter = 0; handleClick() { this.counter++; } constructor() { this.handleClick = this.handleClick.bind(this); }}深層的調(diào)用鏈

箭頭函數(shù)可能讓你遇到麻煩的另一個地方是,它們被用于許多不同的組合,特別是在函數(shù)深層調(diào)用鏈中。

核心原因與匿名函數(shù)相同 – 它們給出了非常糟糕的堆棧跟蹤。

如果你的函數(shù)只是向下一級,比如在迭代器里面,那也不是太糟糕,但是如果你把所有的函數(shù)定義為箭頭函數(shù),并在它們之間來回調(diào)用,你就會陷入困境 遇到一個錯誤的時候,只是收到錯誤消息,如:

{anonymous}(){anonymous}(){anonymous}(){anonymous}(){anonymous}()有動態(tài)上下文的函數(shù)

箭頭函數(shù)可能讓您遇到麻煩的最后一種情況就是嗎, this 是動態(tài)綁定的時候。

如果您在這些位置使用箭頭函數(shù),那么動態(tài)綁定將不起作用,并且你(或稍后使用你的代碼的其他人)可能會對事情未按預期執(zhí)行的原因感到困惑。

一些典型的例子:

事件處理程序是通過將 this 設置為事件的 currentTarget 屬性來調(diào)用。如果您仍在使用 jQuery ,則大多數(shù) jQuery 方法將 this 設置為已選擇的 dom 元素。如果您正在使用 Vue.js ,則方法和計算函數(shù)通常將 this 設置為 Vue 組件。

當然你可以故意使用箭頭函數(shù)來覆蓋這種行為,但特別是在 jQuery 和 Vue 的情況下,這通常會干擾正常運行,讓你感到困惑的是為什么看起來與附近其他代碼相同的代碼不起作用。

總結

箭頭函數(shù)是 JavaScript 語言的一個非常有必要的補充,并且在許多情況下使代碼更符合人們的閱讀習慣。

然而,像所有其他特性一樣,它們有優(yōu)點和缺點。 我們應該將它們作為我們工具箱中的另一個工具,而不是作為所有函數(shù)的全面替代品。

英文原文:https://zendev.com/2018/10/01/javascript-arrow-functions-how-why-when.html

標簽: JavaScript
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
亚洲午夜一区二区| 国产精品 日产精品 欧美精品| 欧美人牲a欧美精品| 欧美精品一区二区三区一线天视频 | 精品白丝av| 欧美精品乱人伦久久久久久| 国产精品国产三级国产aⅴ入口| 日本成人超碰在线观看| av一区二区三区在线| 国产精品免费看| 欧美一区二区三区在线| 亚洲欧美日韩中文字幕一区二区三区| 国产一区二区三区观看| 亚洲日本激情| 日韩精品在线一区二区| 亚洲国产另类av| 国产亚洲在线观看| 五月天婷婷综合| 国产精品红桃| 激情亚洲网站| 亚洲人吸女人奶水| 先锋a资源在线看亚洲| 欧美国产日本视频| 国产精品乡下勾搭老头1| 亚洲一区二区三区涩| 久久久久久久精| 日韩福利视频导航| 91成人网在线| 亚洲黄色小视频| 99视频一区二区三区| 久久色.com| 极品少妇xxxx精品少妇| 激情久久婷婷| 一区二区免费在线| 欧美成人一品| 欧美精品一卡两卡| 成人少妇影院yyyy| 欧美日韩一卡二卡三卡 | 一区二区三区四区在线播放| 国产视频亚洲| 蜜桃一区二区三区在线| 亚洲一区在线免费| 午夜视频在线观看一区二区| 91成人免费电影| 国产成人h网站| 欧美国产激情二区三区| 国产日韩在线一区二区三区| 麻豆国产欧美一区二区三区| 日韩女优毛片在线| 在线播放亚洲| 欧美国产乱子伦| 亚洲精品一区二区三区av| 欧美激情一区二区三区蜜桃视频| 国产综合视频| 亚洲动漫第一页| 欧美日韩不卡视频| 91一区在线观看| 欧美成人一区二区三区片免费 | 欧美精品丝袜久久久中文字幕| 波多野结衣在线aⅴ中文字幕不卡| 欧美日韩精品是欧美日韩精品| 精品在线亚洲视频| 欧美一级日韩一级| 在线观看视频日韩| 另类中文字幕网| 亚洲综合电影一区二区三区| 裸体一区二区三区| 久久久久九九视频| 久久亚裔精品欧美| 日韩影视精彩在线| 乱人伦精品视频在线观看| 亚洲精品一二三| 日本黄色一区二区| 成人av影院在线| 一区二区三区四区不卡在线 | 国产一区二区精品久久| 中文字幕av资源一区| 老司机精品福利视频| 亚洲国产精品人人做人人爽| 欧美久久久一区| 精品999日本| 极品销魂美女一区二区三区| 国产精品青草久久| 精品999网站| 久久国产免费看| 亚洲欧洲韩国日本视频| 99精品视频免费观看视频| 国模冰冰炮一区二区| 在线播放日韩导航| 国产精品porn| 樱花影视一区二区| 欧美巨大另类极品videosbest| 伊人久久综合| 国产精品99久久久久久久vr| 一区二区三区不卡视频在线观看| 日韩免费一区二区| 久久久久久久波多野高潮日日| 99久久99久久久精品齐齐| 国产午夜精品久久久久久久| 午夜精品亚洲| 国产精品美女一区二区三区 | 欧美日韩综合精品| 国产精品一区免费在线观看| 樱花影视一区二区| 久久久午夜精品理论片中文字幕| 在线观看视频一区二区| 激情久久五月天| 欧美国产乱子伦 | 欧美电影精品一区二区| 久久久久国内| 欧美日韩一区二区视频在线| 国产成人av在线影院| 天使萌一区二区三区免费观看| 中国色在线观看另类| 宅男在线国产精品| 国产精品香蕉一区二区三区| 亚洲美女视频一区| 国产无遮挡一区二区三区毛片日本| 欧美日韩在线观看一区二区 | 久久久久久久性| 欧美日韩在线三级| 老司机一区二区三区| 国内精品久久久久久久影视蜜臀 | 99精品久久99久久久久| 精品亚洲成a人在线观看| 一区二区三区成人| 中文无字幕一区二区三区| 日韩一区二区三区精品视频 | 麻豆免费精品视频| 一区二区在线观看视频| 欧美韩日一区二区三区| 欧美www视频| 欧美精品第1页| 色综合久久88色综合天天| 国产亚洲高清视频| 欧美日韩免费观看一区| 成人av动漫网站| 国产在线精品视频| 日韩国产欧美视频| 亚洲成人手机在线| 欧美α欧美αv大片| 欧美最猛性xxxxx直播| 校园春色综合网| 99热这里只有精品8| 亚洲小说欧美另类社区| 色综合天天视频在线观看| 一区二区三区不卡视频| 国产精品视频第一区| 久久综合久久综合久久| 日韩午夜在线观看视频| 欧美日韩成人综合天天影院| 91福利小视频| 色婷婷av久久久久久久| 欧美一级久久| av电影在线观看一区| 成人av手机在线观看| 成人av网站在线观看| 成人一级黄色片| 国产91精品入口| 国产精品久久国产精麻豆99网站| 欧美va亚洲va| 精品福利一二区| 欧美va亚洲va香蕉在线| 欧美大黄免费观看| 欧美xxxxx牲另类人与| 欧美一区二区三区性视频| 91.com在线观看| 欧美一区二区美女| 日韩欧美在线一区二区三区| 欧美成人aa大片| 久久日韩粉嫩一区二区三区| 久久久精品免费观看| 精品国产三级a在线观看| 精品少妇一区二区三区视频免付费| 日韩美女视频一区二区在线观看| 欧美成人一区二区三区片免费| 久久综合视频网| 欧美激情一二三区| 国产精品美女www爽爽爽| 一区在线中文字幕| 最新国产成人在线观看| 7777精品伊人久久久大香线蕉 | 粉嫩av一区二区三区在线播放| 国产精品自产自拍| 高清不卡一二三区| 91网上在线视频| 欧美理论在线| 在线 亚洲欧美在线综合一区| 亚洲免费黄色| 美女成人午夜| 欧美日韩国产综合一区二区三区| 91精品国产综合久久久久久久久久 | 性欧美精品高清| 在线观看不卡一区| 欧美蜜桃一区二区三区| 精品国精品国产| 国产精品美女久久久久久久久久久 | 国内精品国语自产拍在线观看| 亚洲三级毛片| 亚洲一区区二区|