日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

JS什么場(chǎng)景不適合箭頭函數(shù)

瀏覽:237日期:2024-03-31 08:01:35
概述

這些年來(lái),ES6 將js的可用性提升到一個(gè)新的水平時(shí): 箭頭函數(shù)、類(lèi)等等,這些都很棒。

箭頭函數(shù)是最有價(jià)值的新功能之一,有很多好文章描述了它的上下文透明性和簡(jiǎn)短的語(yǔ)法。

但每個(gè)事務(wù)都有兩面。通常,新特性會(huì)帶來(lái)一些混亂,其中之一就是箭頭函數(shù)被誤導(dǎo)了。本文將介紹一些場(chǎng)景,在這些場(chǎng)景中,你應(yīng)該繞過(guò)箭頭函數(shù),轉(zhuǎn)而使用良好的舊函數(shù)表達(dá)式或較新的簡(jiǎn)寫(xiě)語(yǔ)法。并且要注意縮短代碼,因?yàn)檫@會(huì)影響代碼的可讀性。

定義對(duì)象上的方法

在js中,方法是存儲(chǔ)在對(duì)象屬性中的函數(shù)。當(dāng)調(diào)用該方法時(shí),this將指向該方法所屬的對(duì)象。

Object literal

由于箭頭函數(shù)語(yǔ)法簡(jiǎn)短,所以使用它來(lái)定義方法是很有吸引力的,讓咱們來(lái)試一試:

const calculate = { array: [1, 2, 3], sum: () => { console.log(this === window); // => true return this.array.reduce((result, item) => result + item); }};console.log(this === window); // => true// Throws 'TypeError: Cannot read property ’reduce’ of undefined'calculate.sum();

calculate.sum方法用箭頭函數(shù)定義。 但是在調(diào)用時(shí),calculate.sum()會(huì)拋出一個(gè)TypeError,因?yàn)閠his.array為undefined。

當(dāng)調(diào)用calculate對(duì)象上的方法sum()時(shí),上下文仍然是window。之所以會(huì)發(fā)生這種情況,是因?yàn)榧^函數(shù)按詞法作用域?qū)⑸舷挛慕壎ǖ絯indow對(duì)象。

執(zhí)行this.array等同于window.array,它是undefined。

解決方法是使用常規(guī)函數(shù)表達(dá)式來(lái)定義方法。 this 是在調(diào)用時(shí)確定的,而不是由封閉的上下文決定的,來(lái)看看修復(fù)后的版本:

const calculate = { array: [1, 2, 3], sum() { console.log(this === calculate); // => true return this.array.reduce((result, item) => result + item); }};calculate.sum(); // => 6

因?yàn)閟um是常規(guī)函數(shù),所以在調(diào)用calculate.sum()時(shí)this是calculate對(duì)象。this.array是數(shù)組引用,因此正確計(jì)算元素之和:6。

Object prototype

同樣的規(guī)則也適用于在原型對(duì)象上定義方法。使用一個(gè)箭頭函數(shù)來(lái)定義sayCatName方法,this指向window

function MyCat(name) { this.catName = name;}MyCat.prototype.sayCatName = () => { console.log(this === window); // => true return this.catName;};const cat = new MyCat(’Mew’);cat.sayCatName(); // => undefined

使用早期的方式定義函數(shù)表達(dá)式:

function MyCat(name) { this.catName = name;}MyCat.prototype.sayCatName = function() { console.log(this === cat); // => true return this.catName;};const cat = new MyCat(’Mew’);cat.sayCatName(); // => ’Mew’

sayCatName常規(guī)函數(shù)在作為方法調(diào)用時(shí)將上下文更改為cat對(duì)象:cat.sayCatName()。

動(dòng)態(tài)上下文的回調(diào)函數(shù)

this在JS中是一個(gè)強(qiáng)大的特性,它允許根據(jù)調(diào)用函數(shù)的方式更改上下文。通常,上下文是調(diào)用發(fā)生的目標(biāo)對(duì)象,這使得代碼更加自然,就像這個(gè)對(duì)象發(fā)生了什么。

但是,箭頭函數(shù)會(huì)在聲明上靜態(tài)綁定上下文,并且無(wú)法使其動(dòng)態(tài)化,但這種方式有壞也有好,有時(shí)候我們需要?jiǎng)討B(tài)綁定。

在客戶端編程中,將事件偵聽(tīng)器附加到DOM元素是一項(xiàng)常見(jiàn)的任務(wù)。事件觸發(fā)處理程序函數(shù),并將this作為目標(biāo)元素,這里如果使用箭頭函數(shù)就不夠靈活。

下面的示例嘗試為這樣的處理程序使用箭頭函數(shù):

const button = document.getElementById(’myButton’);button.addEventListener(’click’, () => { console.log(this === window); // => true this.innerhtml = ’Clicked button’;});

在全局上下文中this指向window。 當(dāng)發(fā)生單擊事件時(shí),瀏覽器嘗試使用按鈕上下文調(diào)用處理函數(shù),但箭頭函數(shù)不會(huì)更改其預(yù)定義的上下文。this.innerhtml相當(dāng)于window.innerHTML,沒(méi)有任何意義。

必須應(yīng)用函數(shù)表達(dá)式,該表達(dá)式允許根據(jù)目標(biāo)元素更改this:

const button = document.getElementById(’myButton’);button.addEventListener(’click’, function() { console.log(this === button); // => true this.innerHTML = ’Clicked button’;});

當(dāng)用戶單擊按鈕時(shí),處理程序函數(shù)中的this指向button。因此這個(gè)問(wèn)題。innerHTML = ’Clicked button’正確地修改按鈕文本以反映已單擊狀態(tài)。

調(diào)用構(gòu)造函數(shù)

this在構(gòu)造調(diào)用中是新創(chuàng)建的對(duì)象。當(dāng)執(zhí)行new MyFunction()時(shí),構(gòu)造函數(shù)MyFunction的上下文是一個(gè)新對(duì)象:this instanceof MyFunction === true。

注意,箭頭函數(shù)不能用作構(gòu)造函數(shù)。JavaScript通過(guò)拋出異常隱式阻止這樣做。

無(wú)論如何,this是來(lái)自封閉上下文的設(shè)置,而不是新創(chuàng)建的對(duì)象。換句話說(shuō),箭頭函數(shù)構(gòu)造函數(shù)調(diào)用沒(méi)有意義,而且是模糊的。

讓我們看看如果嘗試這樣做會(huì)發(fā)生什么:

const Message = (text) => { this.text = text;};// Throws 'TypeError: Message is not a constructor'const helloMessage = new Message(’Hello World!’);

執(zhí)行new Message(’Hello World!’),其中Message是一個(gè)箭頭函數(shù),JavaScript拋出一個(gè)TypeError錯(cuò)誤,Message不能用作構(gòu)造函數(shù)。

上面的例子可以使用函數(shù)表達(dá)式來(lái)修復(fù),這是創(chuàng)建構(gòu)造函數(shù)的正確方法(包括函數(shù)聲明):

const Message = function(text) { this.text = text;};const helloMessage = new Message(’Hello World!’);簡(jiǎn)寫(xiě)語(yǔ)法

箭頭函數(shù)有一個(gè)很好的屬性,它可以省略參數(shù)圓括號(hào)()、塊大括號(hào){},如果函數(shù)主體只有一條語(yǔ)句,則返回。這有助于編寫(xiě)非常短的函數(shù)。

原文作者的大學(xué)編程教授給學(xué)生一個(gè)有趣的任務(wù):編寫(xiě) 用C語(yǔ)言計(jì)算字符串長(zhǎng)度的最短函數(shù),這是學(xué)習(xí)和探索新語(yǔ)言的好方式。

然而,在實(shí)際應(yīng)用程序中,許多開(kāi)發(fā)人員都會(huì)閱讀代碼。 最短的語(yǔ)法并不總是適合幫助你的同事即時(shí)了解該方法的用途。

在某種程度上,簡(jiǎn)寫(xiě)的函數(shù)變得難以閱讀,所以盡量不要過(guò)度使用。讓各位們看一個(gè)例子

const multiply = (a, b) => b === undefined ? b => a * b : a * b;const double = multiply(2);double(3); // => 6multiply(2, 3); // => 6

multiply返回兩個(gè)數(shù)字的乘法結(jié)果或與第一個(gè)參數(shù)綁定的閉包,以便以后的乘法運(yùn)算。

該函數(shù)運(yùn)行良好,看起來(lái)很短。但從一開(kāi)始就很難理解它是做什么的。

為了使其更具可讀性,可以從箭頭函數(shù)恢復(fù)可選花括號(hào)和return語(yǔ)句,或使用常規(guī)函數(shù):

function multiply(a, b) { if (b === undefined) { return function(b) { return a * b; } } return a * b;}const double = multiply(2);double(3); // => 6multiply(2, 3); // => 6

在簡(jiǎn)短和冗長(zhǎng)之間找到一個(gè)平衡點(diǎn)是很好的,這樣可以使代碼更加直觀。

總結(jié)

毫無(wú)疑問(wèn),箭頭函數(shù)是一個(gè)很好的補(bǔ)充。當(dāng)正確使用時(shí),它會(huì)使前面必須使用.bind()或試圖捕獲上下文的地方變得簡(jiǎn)單,它還簡(jiǎn)化了代碼。

某些情況下的優(yōu)點(diǎn)會(huì)給其他情況帶來(lái)不利。 當(dāng)需要?jiǎng)討B(tài)上下文時(shí),不能使用箭頭函數(shù):定義方法,使用構(gòu)造函數(shù)創(chuàng)建對(duì)象,在處理事件時(shí)從this獲取目標(biāo)。

以上就是JS什么場(chǎng)景不適合箭頭函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于JS的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久久91麻豆精品国产一区| 日韩国产综合| 国产亚洲精品v| 首页国产欧美久久| 亚洲精品观看| 国产精品蜜月aⅴ在线| 国产成人免费精品| 久久久国产亚洲精品| 欧美日韩精品免费观看视频完整| 红桃视频欧美| 亚洲成人一区| 亚洲婷婷丁香| 蜜桃精品视频| 亚洲成av在线| 亚洲精品综合| 美日韩一区二区三区| 日韩在线短视频| 国产亚洲午夜| 青青草精品视频| 成人国产精选| 日韩视频不卡| 久久99性xxx老妇胖精品| 日本高清不卡一区二区三区视频| 亚洲一区二区三区高清不卡| 国产精品日韩精品中文字幕| 黄色在线网站噜噜噜| 国产亚洲午夜| 精品久久久久中文字幕小说| 亚洲一区二区三区高清不卡| 久久的色偷偷| 国产午夜精品一区二区三区欧美 | 高清一区二区三区| 亚洲激情二区| 精品日韩在线| 亚洲精品动态| 日韩成人三级| 日韩超碰人人爽人人做人人添| 国产一区二区三区四区二区| 先锋影音久久久| 麻豆国产精品视频| 蜜桃久久av| 日韩在线视频精品| 国产日韩一区| 黄色成人91| 成人在线超碰| 欧美日韩91| 免费精品视频| 日韩另类视频| 麻豆精品视频在线观看| 水蜜桃久久夜色精品一区的特点 | 婷婷视频一区二区三区| 在线中文字幕播放| 99国产精品久久久久久久| 精品久久福利| 国产亚洲欧美日韩在线观看一区二区 | 黄色精品视频| 亚洲人成在线影院| 91精品一区二区三区综合| 国产欧美另类| 日韩中文字幕一区二区三区| av资源中文在线| 久久精品99国产精品日本| 久热精品在线| 久久视频精品| 国产欧美久久一区二区三区| 亚洲网址在线观看| 宅男在线一区| 亚洲天堂一区二区| 国产一区二区三区亚洲| 亚洲影视一区二区三区| 久久精品99久久无色码中文字幕| 成人在线黄色| 999久久久免费精品国产| 国产精品夜夜夜| 日韩av三区| 蜜桃视频在线观看一区| 亚洲一级少妇| sm久久捆绑调教精品一区| 国产探花一区| 四虎精品一区二区免费| 亚洲伊人影院| 伊人国产精品| 免费成人在线视频观看| 欧美不卡视频| 亚洲欧美综合| 色老板在线视频一区二区| 亚洲美女久久精品| 天堂а√在线最新版中文在线| 精品一区av| 国产不卡精品在线| 精品国产不卡| 色乱码一区二区三区网站| 久久亚洲黄色| 高清日韩中文字幕| 乱一区二区av| 久久69成人| 国产成人精品亚洲线观看| sm久久捆绑调教精品一区| 日韩毛片视频| 婷婷综合六月| 在线视频精品| 亚洲欧美日本国产专区一区| 99国产精品视频免费观看一公开| 欧美日韩国产传媒| 亚洲欧美日本视频在线观看| 亚洲精品2区| 韩日一区二区三区| 日韩网站在线| 蜜桃视频在线观看一区二区| 噜噜噜躁狠狠躁狠狠精品视频 | 久久久精品午夜少妇| 日韩中文在线播放| 国产视频欧美| 国产亚洲字幕| 国产在线视频欧美一区| 日韩欧美一区二区三区免费观看| 国内精品福利| 综合色一区二区| 国产精品久久久网站| 在线手机中文字幕| 亚洲欧洲另类| 日欧美一区二区| 欧美a一区二区| 欧美极品一区二区三区| 欧美成人基地 | 日本天堂一区| 日韩av专区| 国产色综合网| 日本色综合中文字幕| 黄在线观看免费网站ktv| 好吊一区二区三区| 国产日韩欧美一区在线| 日韩国产一区| 99热精品在线| 麻豆精品一区二区综合av| 99久久久久国产精品| 综合亚洲视频| 91av亚洲| 日韩中文一区二区| 国产日韩电影| 欧美一区自拍| 亚洲va在线| 国产精品xxxav免费视频| 2023国产精品久久久精品双 | av中文字幕在线观看第一页| 日韩午夜在线| 精品三区视频| 欧美特黄一区| 国产66精品| 日韩激情av在线| 日韩成人亚洲| 国产精品中文| 欧美日韩视频| 国产中文字幕一区二区三区| 欧美中文字幕| 亚洲最新无码中文字幕久久| 婷婷综合成人| av亚洲免费| 精品三级av| 日韩精品第一| 国产精品丝袜xxxxxxx| 四季av一区二区凹凸精品| 亚洲免费网址| 免费一二一二在线视频| 国产亚洲久久| 蜜臀久久久99精品久久久久久| av综合电影网站| 国产精品一区二区中文字幕| 视频一区欧美精品| 久久久久网站| 美女高潮久久久| 亚洲久久视频| 亚洲一区二区三区四区五区午夜 | 国产精品久久久一区二区| 亚洲作爱视频| 欧美午夜精彩| 亚洲永久av| 精品久久久久中文字幕小说| 欧美亚洲一区二区三区| 久久都是精品| 欧美成人久久| 黄在线观看免费网站ktv| 国产精品成人一区二区网站软件| 亚洲一区导航| 中文日韩在线| 国产专区一区| 四虎影视精品| 亚洲天堂av影院| 精品美女在线视频| 国产精品久久免费视频| 奇米狠狠一区二区三区| 一区在线免费| 欧美日韩国产传媒| 日韩三区在线| 国产+成+人+亚洲欧洲在线| 国产免费av国片精品草莓男男| 亚洲毛片在线免费| 日韩在线a电影| 蜜桃av一区二区三区电影| 99综合视频|