自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何修復(fù)Vue中的 “this is undefined” 問題

開發(fā) 前端
在 JS 中,我們有兩種不同的函數(shù)。它們以幾乎相同的方式運作,除了它們處理變量的方式不同。

當(dāng)我們使用 Vue 在愉快的開發(fā)項目的時候,突然報了一個錯誤:

  1. this is undefined 

別擔(dān)心,不只有你一個人,我也經(jīng)常遇到這個問題很多次,接下我們一起來看看如何解決這個問題。

一個可能的原因是混淆了常規(guī)函數(shù)和箭頭函數(shù)的用法,如果你遇到這個問題,我猜你用的是箭頭函數(shù)。如果用常規(guī)函數(shù)替換箭頭函數(shù),它可能會為你修復(fù)這個問題。

我們再深入一點,試著理解為什么會這樣。

畢竟,知識就是力量,如果知道造成問題的原因,那么我們將來可以避免很多挫敗感和時間浪費。

還有一些其它原因可能也會出現(xiàn)此類錯誤。

  • 使用 fetch 或 axios 獲取數(shù)據(jù)
  • 使用像 lodash 或 underscore 這類的庫

理解兩種主要的函數(shù)類型

在 JS 中,我們有兩種不同的函數(shù)。它們以幾乎相同的方式運作,除了它們處理變量的方式不同。

這給新舊Javascript開發(fā)人員帶來了很多困惑,但是當(dāng)我們弄懂這個問題時,就很好會有這個困惑。

常規(guī)函數(shù)

常規(guī)函數(shù)可以用幾種不同的方式定義。

第一種方法在 Vue 組件中較不常見,因為寫出來要更長一些:

如何修復(fù)Vue中的 “this is undefined” 問題

第二種方法是簡寫方式,我們也經(jīng)常使用:

如何修復(fù)Vue中的 “this is undefined” 問題

在像這樣的常規(guī)函數(shù)中,this將引用函數(shù)的“所有者”。因為我們是在Vue組件上定義它的,所以this指的是Vue組件。

在大多數(shù)情況下,我們應(yīng)該在 Vue 中使用常規(guī)函數(shù),特別是在創(chuàng)建時

  • methods
  • computed props
  • watched props

雖然常規(guī)函數(shù)通常是我們所需要的,但是箭頭函數(shù)也非常方便。

箭頭函數(shù)

箭頭函數(shù)可以更短,更快的編寫,因此最近獲得了廣泛的歡迎。但是,它們在對象上定義方法時并沒有太大的不同,就像我們在編寫Vue組件時所做的那樣。

這是他們在Vue組件上的樣子:

如何修復(fù)Vue中的 “this is undefined” 問題

在處理 this 問題時,真正的差異開始發(fā)揮作用。

箭頭函數(shù)采用詞法作用域,意味著箭頭函數(shù)從它的上下文中獲取this。

如果試圖從Vue組件上的箭頭函數(shù)內(nèi)部訪問 this,將得到一個錯誤,因為 this 不存在

如何修復(fù)Vue中的 “this is undefined” 問題

簡而言之,盡量避免在Vue組件上使用箭頭函數(shù)。這將會省去許多頭痛和困惑的問題。

有時使用箭頭函數(shù)是很好的,但這只在不引用this的情況下才有效。

如何修復(fù)Vue中的 “this is undefined” 問題

現(xiàn)在我們知道兩種主要的函數(shù)類型,如何正確使用它們?

匿名函數(shù)

當(dāng)我們只需要創(chuàng)建一個函數(shù)而不需要從其他任何地方調(diào)用它時,匿名函數(shù)非常有用。

下面是使用匿名函數(shù)的一些場景:

  • 使用 axios 或 fetch 訪存數(shù)據(jù)
  • filter、map和reduce等函數(shù)方法
  • 在 Vue 方法中的任何地方

來個例子看一下:

如何修復(fù)Vue中的 “this is undefined” 問題

從示例中可以看到,大多數(shù)情況下,當(dāng)我們創(chuàng)建匿名函數(shù)時,使用箭頭函數(shù)。我們通常使用箭頭函數(shù)有幾個原因:

  • 更短、更簡潔的語法
  • 改善可讀性
  • this 取自父類

在Vue方法中,箭頭函數(shù)也可以作為匿名函數(shù)使用。

等等,我們不是剛發(fā)現(xiàn)當(dāng)我們試圖訪問 this 時,箭頭函數(shù)不起作用嗎?

這就是區(qū)別所在。

當(dāng)我們在常規(guī)函數(shù)或簡寫函數(shù)中使用箭頭函數(shù)時,常規(guī)函數(shù)將this設(shè)置為我們的Vue組件,而箭頭函數(shù)則不一樣。

來個例子:

如何修復(fù)Vue中的 “this is undefined” 問題

filter方法可以訪問this.match,因為箭頭函數(shù)使用的方法與filteredMessages方法使用的上下文相同。由于此方法是常規(guī)函數(shù)(而不是箭頭函數(shù)),因此將其自身的上下文設(shè)置為Vue實例。

讓我們進(jìn)一步討論如何使用axios或fetch來獲取數(shù)據(jù)。

在獲取數(shù)據(jù)時使用正確的函數(shù)

如果正在使用fetch或axios獲取異步數(shù)據(jù),最好使用 Promise。Promise喜歡匿名箭頭函數(shù),它們也使處理this問題變得容易得多。

如果你正在獲取一些數(shù)據(jù)并想在你的組件上設(shè)置它,這是你應(yīng)該做的正確的方式:

如何修復(fù)Vue中的 “this is undefined” 問題

請注意,我們?nèi)绾卧?Vue 組件上使用常規(guī)函數(shù)作為方法,然后在 Promise 內(nèi)部使用匿名箭頭函數(shù)

如何修復(fù)Vue中的 “this is undefined” 問題

在fetchData()作用域內(nèi),我們將this設(shè)置為Vue組件,因為它是一個常規(guī)函數(shù)。由于箭頭函數(shù)使用外部作用域作為它們自己的作用域,因此箭頭函數(shù)也將this設(shè)置為我們的Vue組件。

這允許我們通過this訪問 Vue 組件并更新dataFromServer。

但是,如果需要將函數(shù)傳遞幫助庫,比如lodash或underscore,該怎么辦呢

與 Lodash 或 Underscore 一起使用

假設(shè)我們的Vue組件上有一個要使用Lodash或Underscore方法。如何防止this is undefine的錯誤。

如果你用過 React ,你可能見過類似的東西。

這是我們用Vue做的。

如何修復(fù)Vue中的 “this is undefined” 問題

就是這樣!

我們要做的就是獲取函數(shù),將其包裝在debounce函數(shù)中,然后返回一個內(nèi)建了debounce的新函數(shù)。現(xiàn)在,當(dāng)我們在Vue組件上調(diào)用this.methodToDebounce()時,我們將調(diào)用debounced版本。

什么是詞法作用域

如前所述,常規(guī)函數(shù)和箭頭函數(shù)之間存在差異的主要原因與詞法作用域有關(guān)。來分析一下它的含義。

首先,作用域是程序中存在變量的任何區(qū)域。在Javascript中,window 變量具有全局作用域,它在任何地方都可用。盡管大多數(shù)變量被限制在定義它們的函數(shù)、它們所屬的類或模塊中。

其次,單詞“詞法”僅僅意味著作用域由你如何編寫代碼決定。某些編程語言只在程序運行時才確定作用域內(nèi)的內(nèi)容。這可能會讓人很困惑,所以大多數(shù)語言都只使用詞法作用域。

箭頭函數(shù)使用詞法作用域,而常規(guī)函數(shù)和簡寫函數(shù)不使用。

這里最棘手的部分是詞法作用域如何在函數(shù)中影響 this。對于箭頭函數(shù),this與外部作用域的this綁定在一起。常規(guī)函數(shù)的this綁定方式有些奇怪,這就是引入箭頭函數(shù)的原因,也是為什么大多數(shù)人盡可能多地使用箭頭函數(shù)的原因。

作用域如何在函數(shù)中工作

下面是一些示例,它們演示了作用域如何在這兩種函數(shù)類型之間以不同的方式工作

如何修復(fù)Vue中的 “this is undefined” 問題

將作用域綁定到函數(shù)上

我們可以使用 bind 方法來改變 this 的綁定:

  1. const boundFunction = unboundFunction.bind(this); 

這使我們在編寫Vue組件時具有更大的靈活性,更輕松地重用方法。當(dāng)然,可讀性相對差點,應(yīng)該盡量避免太頻繁地使用它。

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2015-07-28 14:45:31

ubuntu修復(fù)系統(tǒng)程序

2013-05-30 08:49:37

網(wǎng)絡(luò)路由路由修復(fù)路由

2018-03-05 19:20:49

LinuxWordPressHTTP

2019-08-22 10:43:15

Windows 10相機(jī)修復(fù)

2016-10-20 09:17:23

LinuxU盤驅(qū)動器

2018-08-30 10:28:05

修復(fù)Windows 10IntcOED

2015-09-21 09:10:36

排查修復(fù)Windows 10

2016-07-04 08:19:13

混合IT網(wǎng)絡(luò)問題SaaS

2018-09-27 11:50:06

修復(fù)Windows 10Razer

2013-07-17 16:28:58

系統(tǒng)raid

2016-07-29 17:08:30

修復(fù)網(wǎng)絡(luò)問題

2023-04-25 18:54:13

數(shù)據(jù)數(shù)據(jù)丟失

2019-03-04 11:30:07

修復(fù)Windows 10系統(tǒng)文件

2020-11-11 08:00:00

Linux系統(tǒng)修復(fù)

2018-09-20 09:40:13

修復(fù)Windows 10Chrome

2014-06-17 15:20:09

Wi-FiiPadiPhone

2018-08-30 10:00:12

Windows 10修復(fù)黑屏

2014-01-09 10:07:18

JavaScriptNull

2025-02-13 13:14:49

JavaScriptnullundefined

2023-02-22 15:22:13

Ubuntu命令
點贊
收藏

51CTO技術(shù)棧公眾號