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

連接你、我、他 —— this

開發(fā) 前端
在開始今天的課程之前,先拋出一個結論,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(); 

執(zhí)行上面的代碼,打印的結果是:

打印結果都是 WuHan,這個例子迷惑的地方主要是下面這兩個 from 的定義,第一個屬于全局變量,第二個屬于局部變量,logFrom 函數(shù)使用的是全局的 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. }; 

當執(zhí)行:

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

執(zhí)行結果是 undefined。

當執(zhí)行:

  1. obj.logFrom(); 

執(zhí)行結果是 BeiJing。

為什么會是這樣?

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

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

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

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

使用第 1、2 這兩條可以搞定大多數(shù) 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(); 

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

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

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

this 指向就是當前創(chuàng)建的對象,下面代碼中 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 是否可以是另外一個對象呢?下節(jié)內容講。大家加油。

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

2021-10-29 18:56:48

IO網(wǎng)絡工具

2020-02-11 14:14:52

this函數(shù)

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

2019-10-28 08:20:15

色情網(wǎng)站國內域名 IP

2009-05-11 11:30:26

面試官程序員求職

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++特性函數(shù)

2020-04-26 09:33:36

三次握手網(wǎng)絡協(xié)議HTTP

2015-03-18 11:38:38

.com
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av一二三区| 精品久久久久久久久久久 | www.日本国产 | 国产视频中文字幕 | 欧美一级免费片 | 精品国产一区二区在线 | 成人午夜精品一区二区三区 | av色站 | 秋霞影院一区二区 | www.三级| 雨宫琴音一区二区在线 | 国产免费又色又爽又黄在线观看 | 欧美大片一区二区 | 欧美中文字幕一区二区三区亚洲 | 黄片毛片在线观看 | 精品国产一区二区国模嫣然 | 精品欧美色视频网站在线观看 | 91免费在线视频 | 亚洲欧美日韩精品久久亚洲区 | 在线色网| 一级片av | 亚洲永久字幕 | 久久久久久久久久毛片 | 97视频在线观看免费 | 免费黄篇 | 成人精品国产免费网站 | 九色视频网站 | 久草视频观看 | 亚洲免费视频在线观看 | 国产美女在线观看 | 91久久精品国产91久久 | 亚洲国产成人久久综合一区,久久久国产99 | 国产精品99久久久久久宅男 | 国产精品久久久久久久久久 | 中文字幕在线观看成人 | 天堂中文在线播放 | 香蕉久久久 | 91国内视频在线 | 欧美激情久久久 | 欧美在线一区二区视频 | 天天夜碰日日摸日日澡 |