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

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

JS什么場景不適合箭頭函數

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

這些年來,ES6 將js的可用性提升到一個新的水平時: 箭頭函數、類等等,這些都很棒。

箭頭函數是最有價值的新功能之一,有很多好文章描述了它的上下文透明性和簡短的語法。

但每個事務都有兩面。通常,新特性會帶來一些混亂,其中之一就是箭頭函數被誤導了。本文將介紹一些場景,在這些場景中,你應該繞過箭頭函數,轉而使用良好的舊函數表達式或較新的簡寫語法。并且要注意縮短代碼,因為這會影響代碼的可讀性。

定義對象上的方法

在js中,方法是存儲在對象屬性中的函數。當調用該方法時,this將指向該方法所屬的對象。

Object literal

由于箭頭函數語法簡短,所以使用它來定義方法是很有吸引力的,讓咱們來試一試:

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方法用箭頭函數定義。 但是在調用時,calculate.sum()會拋出一個TypeError,因為this.array為undefined。

當調用calculate對象上的方法sum()時,上下文仍然是window。之所以會發生這種情況,是因為箭頭函數按詞法作用域將上下文綁定到window對象。

執行this.array等同于window.array,它是undefined。

解決方法是使用常規函數表達式來定義方法。 this 是在調用時確定的,而不是由封閉的上下文決定的,來看看修復后的版本:

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

因為sum是常規函數,所以在調用calculate.sum()時this是calculate對象。this.array是數組引用,因此正確計算元素之和:6。

Object prototype

同樣的規則也適用于在原型對象上定義方法。使用一個箭頭函數來定義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

使用早期的方式定義函數表達式:

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常規函數在作為方法調用時將上下文更改為cat對象:cat.sayCatName()。

動態上下文的回調函數

this在JS中是一個強大的特性,它允許根據調用函數的方式更改上下文。通常,上下文是調用發生的目標對象,這使得代碼更加自然,就像這個對象發生了什么。

但是,箭頭函數會在聲明上靜態綁定上下文,并且無法使其動態化,但這種方式有壞也有好,有時候我們需要動態綁定。

在客戶端編程中,將事件偵聽器附加到DOM元素是一項常見的任務。事件觸發處理程序函數,并將this作為目標元素,這里如果使用箭頭函數就不夠靈活。

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

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

在全局上下文中this指向window。 當發生單擊事件時,瀏覽器嘗試使用按鈕上下文調用處理函數,但箭頭函數不會更改其預定義的上下文。this.innerhtml相當于window.innerHTML,沒有任何意義。

必須應用函數表達式,該表達式允許根據目標元素更改this:

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

當用戶單擊按鈕時,處理程序函數中的this指向button。因此這個問題。innerHTML = ’Clicked button’正確地修改按鈕文本以反映已單擊狀態。

調用構造函數

this在構造調用中是新創建的對象。當執行new MyFunction()時,構造函數MyFunction的上下文是一個新對象:this instanceof MyFunction === true。

注意,箭頭函數不能用作構造函數。JavaScript通過拋出異常隱式阻止這樣做。

無論如何,this是來自封閉上下文的設置,而不是新創建的對象。換句話說,箭頭函數構造函數調用沒有意義,而且是模糊的。

讓我們看看如果嘗試這樣做會發生什么:

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

執行new Message(’Hello World!’),其中Message是一個箭頭函數,JavaScript拋出一個TypeError錯誤,Message不能用作構造函數。

上面的例子可以使用函數表達式來修復,這是創建構造函數的正確方法(包括函數聲明):

const Message = function(text) { this.text = text;};const helloMessage = new Message(’Hello World!’);簡寫語法

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

原文作者的大學編程教授給學生一個有趣的任務:編寫 用C語言計算字符串長度的最短函數,這是學習和探索新語言的好方式。

然而,在實際應用程序中,許多開發人員都會閱讀代碼。 最短的語法并不總是適合幫助你的同事即時了解該方法的用途。

在某種程度上,簡寫的函數變得難以閱讀,所以盡量不要過度使用。讓各位們看一個例子

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

multiply返回兩個數字的乘法結果或與第一個參數綁定的閉包,以便以后的乘法運算。

該函數運行良好,看起來很短。但從一開始就很難理解它是做什么的。

為了使其更具可讀性,可以從箭頭函數恢復可選花括號和return語句,或使用常規函數:

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

在簡短和冗長之間找到一個平衡點是很好的,這樣可以使代碼更加直觀。

總結

毫無疑問,箭頭函數是一個很好的補充。當正確使用時,它會使前面必須使用.bind()或試圖捕獲上下文的地方變得簡單,它還簡化了代碼。

某些情況下的優點會給其他情況帶來不利。 當需要動態上下文時,不能使用箭頭函數:定義方法,使用構造函數創建對象,在處理事件時從this獲取目標。

以上就是JS什么場景不適合箭頭函數的詳細內容,更多關于JS的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产一区调教| 丁香六月综合| 亚洲激情黄色| 亚洲欧美网站| 欧美啪啪一区| 久久精品伊人| 国产成人免费视频网站视频社区| 久久精品国产在热久久| 精品三区视频| 久久九九精品| 中文字幕一区二区三区日韩精品 | 久久精品国产99久久| 99精品国产一区二区三区| 狠狠干成人综合网| 国产日韩视频| 私拍精品福利视频在线一区| 亚洲综合二区| 你懂的亚洲视频| 一区二区小说| 久久国产麻豆精品| 日本少妇一区| 91综合久久爱com| 成年男女免费视频网站不卡| 成人自拍av| 欧美久久久网站| 日韩欧美精品| 国产视频一区二| 亚洲国产日韩欧美在线| 国产欧美日韩在线一区二区| 亚洲一级黄色| 精品欠久久久中文字幕加勒比| 欧美日韩免费观看一区=区三区| 91成人小视频| 日韩中文字幕av电影| 天堂√中文最新版在线| 欧美日韩精品一区二区三区在线观看| 欧美日韩精品免费观看视欧美高清免费大片 | 欧美~级网站不卡| 久久超碰99| 日韩**一区毛片| 伊人久久婷婷| 久久久久免费av| 久久中文精品| 日韩成人在线看| 亚洲一区二区免费看| 亚洲不卡系列| 涩涩av在线| 欧美好骚综合网| 精品免费av| 免费看久久久| 日韩精品久久久久久久软件91| 日韩不卡在线| 日产精品一区二区| 精品免费视频| 国产一区二区三区天码| 国产精品亚洲人成在99www| 午夜亚洲精品| aa国产精品| 日韩午夜精品| 婷婷综合激情| 男女男精品视频网| 综合一区二区三区| 色综合视频一区二区三区日韩 | 婷婷激情久久| 久久青草久久| 亚洲国产一区二区三区在线播放 | 亚洲日本免费电影| 亚洲人成亚洲精品| 亚洲狼人精品一区二区三区| 亚洲精品福利| 美女国产一区二区三区| 国产精品日本一区二区三区在线| 国产精品任我爽爆在线播放| 色综合五月天| 亚洲欧美激情诱惑| 日韩午夜一区| 欧美影院视频| 成人三级高清视频在线看| 99热精品久久| 日本中文字幕视频一区| 久久福利在线| 欧美特黄一级| 国产精品日韩精品中文字幕| 欧美亚洲日本精品| 综合干狼人综合首页| 精品五月天堂| 久久性天堂网| 久久久久久色 | 日韩精品免费观看视频| 老司机精品视频在线播放| 亚洲先锋成人| 久久av中文| 99成人在线| 国产videos久久| 亚洲久久视频| 国产高清不卡| 久久国产人妖系列| 欧美午夜不卡| 欧美一区在线观看视频| 国产国产精品| 久久久久久婷| 国产欧美自拍| 亚洲视频国产精品| 激情六月综合| 国产一区二区三区探花| 亚洲97av| 欧美精品自拍| 欧美日韩精品一区二区视频| 国产精品久av福利在线观看| 亚洲男女自偷自拍| 国产专区一区| 日韩久久精品| 日韩av片子| 欧美另类中文字幕| 欧美精品影院| 日韩国产在线观看| 日韩精品免费观看视频| 噜噜噜久久亚洲精品国产品小说| 超碰99在线| 久久青青视频| 四虎成人av| 日韩成人高清| 播放一区二区| 亚洲五月婷婷| 伊人久久亚洲影院| 水野朝阳av一区二区三区| 狠狠久久婷婷| 免费成人av在线播放| 欧美丝袜一区| 亚洲精品小说| 婷婷久久一区| 亚洲精品系列| 国产亚洲精品美女久久| 国产免费久久| 风间由美中文字幕在线看视频国产欧美| 国产剧情在线观看一区| 国产精品第十页| 日韩国产在线| 99成人在线| 国产精品主播| 成人av三级| 蜜臀a∨国产成人精品| 国产情侣久久| 国产精品成久久久久| 久久久精品五月天| 蜜桃久久久久久| 欧美成人精品午夜一区二区| 亚洲精品在线影院| 日精品一区二区三区| 伊人网在线播放| 亚洲精品国产日韩| 国产一区二区亚洲| 99日韩精品| 久久精品国产亚洲一区二区三区| 99久久精品费精品国产| 亚洲免费影院| 国产一区二区三区91| 视频一区欧美精品| 国产日韩一区二区三区在线| 人人精品亚洲| 奇米777国产一区国产二区| 亚洲www免费| 国产欧美一级| 免费在线观看精品| 天堂日韩电影| 精品国产亚洲一区二区三区在线 | 亚洲作爱视频| 美女性感视频久久| 9久re热视频在线精品| 久久精品福利| 日韩和欧美一区二区| 今天的高清视频免费播放成人| 美女久久精品| 深夜福利一区| 亚洲中午字幕| 国产一区日韩欧美| 欧美少妇精品| 国产a亚洲精品| 国产精品久久乐| 日韩av一区二区在线影视| 欧美日韩精品一本二本三本| 日韩av一级| 麻豆mv在线观看| 国产aⅴ精品一区二区三区久久| 国产欧美日韩一区二区三区在线| 亚洲午夜久久| 亚洲深深色噜噜狠狠爱网站| 99国产精品久久久久久久| 免费久久精品| 婷婷激情综合| 视频一区二区三区在线| 丝袜美腿亚洲一区| 最新亚洲激情| 国产精品社区| 亚洲人妖在线| 欧美日韩一区二区三区在线电影| 日韩激情啪啪| 国产亚洲欧美日韩在线观看一区二区 | 国产精品午夜av| 免费日韩一区二区三区|