成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

連接你、我、他 —— this

開發 前端
在開始今天的課程之前,先拋出一個結論,JavaScript 中的 this 并不難,反而非常容易掌握。

在開始今天的課程之前,先拋出一個結論,JavaScript 中的 this 并不難,反而非常容易掌握。

我們先看一段代碼:

  1. let from = 'WuHan'
  2.  
  3. var obj = { 
  4.     from: 'BeiJing', 
  5.     logFrom: function () { 
  6.         console.log(from); 
  7.     } 
  8. }; 
  9.  
  10. let logFrom = obj.logFrom; 
  11. logFrom(); 
  12. obj.logFrom(); 

執行上面的代碼,打印的結果是:

打印結果都是 WuHan,這個例子迷惑的地方主要是下面這兩個 from 的定義,第一個屬于全局變量,第二個屬于局部變量,logFrom 函數使用的是全局的 from 還是 obj 對象內部的 from。答案是「使用全局的 from」。

那如果想使用 obj 對象內部定義的 from 該咋么做呢?這就需要進入我們今天要討論的話題 「this 機制」,困擾讀者比較深的是 this 究竟代表誰。記住一句話「this 始終代表的是一個對象」。

當把上面的代碼換成( 把打印語句 console.log(from) 換成 console.log(this.from) ):

  1. var obj = { 
  2.     from: 'BeiJing', 
  3.     logFrom: function () { 
  4.         console.log(this.from); 
  5.     } 
  6. }; 

當執行:

  1. let logFrom = obj.logFrom; 
  2. logFrom(); 

執行結果是 undefined。

當執行:

  1. obj.logFrom(); 

執行結果是 BeiJing。

為什么會是這樣?

其實 this 就是被「動態」綁定到執行上下文中的一個屬性,也就是說當構建一個執行上下文的時候就會綁定一個 this 屬性。主要有兩種執行上下文:全局執行上下文和函數執行上下文,那么就有兩種 this,一種全局執行上下文中的 this,另一種是函數執行上下文中的 this。

(1) 當在全局執行一個函數的時候(通過括號的方式執行),this 指向全局對象,在瀏覽器中,如果在嚴格模式下 this 為 undefined,在非嚴格模式下,this 為 window。比如 let logFrom = obj.logFrom,此時變量 logFrom 屬于全局變量,通過全局調用一個函數,this 為 window(這里屬于非嚴格模式),window 沒有屬性 from,故結果為 undefined。

這里給大家留個思考題,如果把第一行代碼中的 let 換成 var,結果是什么?

(2) 當通過某個對象調用一個方法的時候,this 為當前的對象。比如通過 obj 調用方法 logFrom,this 為 obj,所以打印結果為 BeiJing。

使用第 1、2 這兩條可以搞定大多數 this 的問題,但是有一種情況需要留意。比如下面的代碼:

  1. let lefex = { 
  2.     name: 'suyan', 
  3.     age: 0, 
  4.     addAge: function () { 
  5.         console.log('outer this = ', this); 
  6.         this.age += 2; 
  7.         setTimeout(function () { 
  8.             console.log('inner this = ', this); 
  9.             this.age += 1; 
  10.         }, 100); 
  11.     } 
  12. }; 
  13. lefex.addAge(); 

打印結果為(非嚴格模式下執行):

結果發現兩個 this 并不一樣,內部函數并不會繼承外部函數的 this。為了解決這個問題,就有了 let that = this 這樣丑陋的代碼。

當然可以使用箭頭函數解決這個問題:

this 指向就是當前創建的對象,下面代碼中 this 指的是 suyan。

  1. function Person(name) { 
  2.     this.name = name; 
  3.     console.log(this); 
  4. let suyan = new Person('suyan'); 

關于 this 應用比較廣泛的一個話題是,如何改變 this 的指向,比如 lefex 對象中的方法 addAge 中的 this 是否可以是另外一個對象呢?下節內容講。大家加油。

責任編輯:趙寧寧 來源: 素燕
相關推薦

2021-10-29 18:56:48

IO網絡工具

2020-02-11 14:14:52

this函數

2021-08-16 08:02:34

技術文檔代碼

2020-07-20 07:48:53

單例模式

2015-03-25 09:42:21

2025-05-26 04:21:00

2009-06-02 08:14:42

2025-01-14 08:32:55

2009-05-11 11:30:26

面試官程序員求職

2019-10-28 08:20:15

色情網站國內域名 IP

2021-01-08 09:14:59

分布式事務框架

2019-11-06 16:33:29

Ignite微軟技術

2024-03-26 07:58:12

Redis編程模型

2024-01-22 11:25:18

2020-05-28 22:15:35

虛擬機JVMJDK

2025-05-28 01:22:00

SpringBeanXML

2024-12-05 08:58:20

類加載JVMJava 虛擬機

2020-07-22 08:58:56

C++特性函數

2020-04-26 09:33:36

三次握手網絡協議HTTP

2015-03-18 11:38:38

.com
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91视频免费视频 | 欧美日韩国产精品一区二区 | 91视视频在线观看入口直接观看 | 国产亚洲精品美女久久久久久久久久 | 91精品国产综合久久久久 | 少妇一级淫片aaaaaaaaa | 亚洲欧美日韩精品久久亚洲区 | 成人免费视频观看视频 | 久久99精品久久久久久噜噜 | 国产精品一区二区不卡 | 亚洲天堂中文字幕 | 999久久久| 国产精品精品视频一区二区三区 | 久久久久久久久久久久久91 | 日本一区高清 | eeuss国产一区二区三区四区 | 视频在线一区 | 国产一区二区三区视频免费观看 | 操夜夜| 国产精品一区视频 | 一级日批片 | 狠狠操你| 午夜精品久久久久久久久久久久久 | 日韩高清国产一区在线 | 欧美一区二区三区在线观看 | 亚洲一区久久 | 欧美日韩一本 | 亚洲高清在线播放 | 国产三级精品三级在线观看四季网 | 欧美一区免费 | 日韩一区二区三区在线观看视频 | 午夜小视频免费观看 | 精品国产一区探花在线观看 | 91精品中文字幕一区二区三区 | 日韩一区三区 | 日韩精品成人av | 91大神在线看 | 精品欧美一区二区三区久久久 | 欧美影院| 午夜影院在线免费观看视频 | 久久久女女女女999久久 |