亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

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

JavaScript哪些場景不能使用箭頭函數(shù)

瀏覽:48日期:2023-10-01 13:45:02
1. 定義對象方法

JS 中對象方法的定義方式是在對象上定義一個指向函數(shù)的屬性,當(dāng)方法被調(diào)用的時候,方法內(nèi)的 this 就會指向方法所屬的對象。

let obj = { array: [1, 2, 3], sum: () => {console.log(this === window); // truereturn this.array.reduce((result, item) => result + item); }};console.log(this === window); //trueobj.sum();//報錯:Uncaught TypeError: Cannot read property ’reduce’ of undefined at Object.sum

運(yùn)行時 this.array 是未定義的,調(diào)用 obj.sum 的時候,執(zhí)行上下文里面的 this 仍然指向的是 window,原因是箭頭函數(shù)把函數(shù)上下文綁定到了 window 上,this.array 等價于 window.array,顯然后者是未定義的。

修改方式:使用函數(shù)表達(dá)式或者方法簡寫(ES6 中已經(jīng)支持)來定義方法,這樣能確保 this 是在運(yùn)行時是由包含它的上下文決定的。代碼如下:

let obj = { array: [1, 2, 3], sum() {console.log(this === window); // falsereturn this.array.reduce((result, item) => result + item); }};console.log(this === window); //trueconsole.log(obj.sum());//62.定義原型方法

同樣的規(guī)則適用于原型方法(prototype method)的定義,使用箭頭函數(shù)會導(dǎo)致運(yùn)行時的執(zhí)行上下文錯誤。比如下面代碼:

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

使用傳統(tǒng)的函數(shù)表達(dá)式就能解決問題,代碼如下所示:

function Cat(name) { this.name = name;}Cat.prototype.sayCatName = function () { console.log(this === window); // => false return this.name;}const cat = new Cat(’Tom’);console.log(cat.sayCatName()); // Tom

sayCatName 變成普通函數(shù)之后,被調(diào)用時的執(zhí)行上下文就會指向新創(chuàng)建的 cat 實(shí)例。

3. 定義事件回調(diào)函數(shù)

箭頭函數(shù)在聲明的時候就綁定了執(zhí)行上下文,要動態(tài)改變上下文是不可能的,在需要動態(tài)上下文的時候它的弊端就凸顯出來。

比如在客戶端編程中常見的 DOM 事件回調(diào)函數(shù)(event listenner)綁定,觸發(fā)回調(diào)函數(shù)時 this 指向當(dāng)前發(fā)生事件的 DOM 節(jié)點(diǎn),而動態(tài)上下文這個時候就非常有用,比如下面這段代碼試圖使用箭頭函數(shù)來作事件回調(diào)函數(shù)。

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

在全局上下文下定義的箭頭函數(shù)執(zhí)行時 this 會指向 window,當(dāng)單擊事件發(fā)生時,this.innerHTML 就等價于 window.innerHTML,而后者是沒有任何意義的。

使用函數(shù)表達(dá)式就可以在運(yùn)行時動態(tài)的改變 this,修正后的代碼:

const button = document.getElementById(’myButton’);button.addEventListener(’click’, function () { console.log(this === button); // true this.innerHTML = ’Clicked button’;});4. 定義構(gòu)造函數(shù)

構(gòu)造函數(shù)中的 this 指向新創(chuàng)建的對象,當(dāng)執(zhí)行 new Car() 的時候,構(gòu)造函數(shù) Car 的上下文就是新創(chuàng)建的對象,也就是說 this instanceof Car === true。顯然,箭頭函數(shù)是不能用來做構(gòu)造函數(shù), 實(shí)際上 JS 會禁止你這么做,如果你這么做了,它就會拋出異常。

比如下面的代碼就會報錯:

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

構(gòu)造新的 Message 實(shí)例時,JS 引擎拋了錯誤,因?yàn)?Message 不是構(gòu)造函數(shù)。可以通過使用函數(shù)表達(dá)式或者函數(shù)聲明來聲明構(gòu)造函數(shù)修復(fù)上面的例子。

const Message = function(text) { this.text = text;};const helloMessage = new Message(’Hello World!’);console.log(helloMessage.text); // ’Hello World!’

以上就是JavaScript哪些場景不能使用箭頭函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于JavaScript不能使用箭頭函數(shù)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 免费碰碰视频 | 九九热精品视频在线播放 | 在线观看www妖精免费福利视频 | 久久99精品久久久久久青青日本 | 搡女人的高清免费视频 | 色婷婷色99国产综合精品 | 国产aⅴ片 | 华人黄网站大全 | 亚洲小younv另类 | 亚洲国产成人超福利久久精品 | www.黄色片.com | 国产专区在线视频 | 国产亚洲欧美在在线人成 | 不卡中文一二三区 | 农村寡妇一级毛片免费播放 | 亚洲图片色 | 777成了人乱视频 | 国产福利视频精品 | 成人国产精品视频频 | 久青草国产在线视频_久青草免 | 国产精品深爱在线 | 黄网在线观看免费 | 亚洲一级黄色 | 日韩亚洲国产欧美精品 | 6080yy午夜不卡一二三区 | 九九精品久久久久久久久 | 国产成 人 综合 亚洲绿色 | 午夜精品久久久久久久第一页 | 调教~奴●メイドの馆 | 亚洲色图 p| 欧美ol丝袜高跟秘书在线播放 | 激情五月色综合亚洲小说 | 亚洲国产精品久久精品成人 | 国产精品麻豆高清在线观看 | 在线观看中文字幕第一页 | 亚洲成在人天堂一区二区 | 香蕉视频色板 | 无遮挡毛片 | 成人www | 521香蕉在线观看视频 | 日本韩国欧美一区 |