精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

換個思路理解Javascript中的this

開發 前端 開發工具
在網上很多文章都對 Javascript 中的 this 做了詳細的介紹,但大多是介紹各個綁定方式或調用方式下 this 的指向,于是我想有一個統一的思路來更好理解 this 指向,使大家更好判斷,以下有部分內容不是原理,而是一種解題思路。

在網上很多文章都對 Javascript 中的 this 做了詳細的介紹,但大多是介紹各個綁定方式或調用方式下 this 的指向,于是我想有一個統一的思路來更好理解 this 指向,使大家更好判斷,以下有部分內容不是原理,而是一種解題思路。

從call方法開始

call 方法允許切換函數執行的上下文環境(context),即 this 綁定的對象。

大多數介紹 this 的文章中都會把 call 方法放到***介紹,但此文我們要把 call 方法放在***位介紹,并從 call 方法切入來研究 this ,因為 call 函數是顯式綁定 this 的指向,我們來看看它如何模擬實現(不考慮傳入 null 、 undefined 和原始值):

  1. Function.prototype.call = function(thisArg) { 
  2.     var context = thisArg; 
  3.     var arr = []; 
  4.     var result; 
  5.  
  6.     context.fn = this; 
  7.  
  8.     for (let i = 1, len = arguments.length; i < len; i++) { 
  9.         arr.push('arguments[' + i + ']'); 
  10.     } 
  11.  
  12.     result = eval("context.fn(" + arr + ")"); 
  13.  
  14.     delete context.fn; 
  15.  
  16.     return result; 
  17.  

從以上代碼我們可以看到,把調用 call 方法的函數作為***個參數對象的方法,此時相當于把***個參數對象作為函數執行的上下文環境,而 this 是指向函數執行的上下文環境的,因此 this 就指向了***個參數對象,實現了 call 方法切換函數執行上下文環境的功能。

對象方法中的this

在模擬 call 方法的時候,我們使用了對象方法來改變 this 的指向。調用對象中的方法時,會把對象作為方法的上下文環境來調用。

既然 this 是指向執行函數的上下文環境的,那我們先來研究一下調用函數時的執行上下文情況。

下面我門來看看調用對象方法時執行上下文是如何的:

  1. var foo = { 
  2.     x : 1, 
  3.     getX: function(){ 
  4.         console.log(this.x); 
  5.     } 
  6. foo.getX(); 

 

從上圖中,我們可以看出getX方法的調用者的上下文是foo,因此getX方法中的 this 指向調用者上下文foo,轉換成 call 方法為foo.getX.call(foo)。

下面我們把其他函數的調用方式都按調用對象方法的思路來轉換。

構造函數中的this

  1. function Foo(){ 
  2.     this.x = 1; 
  3.     this.getX = function(){ 
  4.         console.log(this.x); 
  5.     } 
  6. var foo = new Foo(); 
  7. foo.getX();  

執行 new 如果不考慮原型鏈,只考慮上下文的切換,就相當于先創建一個空的對象,然后把這個空的對象作為構造函數的上下文,再去執行構造函數,***返回這個對象。

  1. var newMethod = function(func){ 
  2.     var context = {}; 
  3.     func.call(context); 
  4.     return context; 
  5. function Foo(){ 
  6.     this.x = 1; 
  7.     this.getX = function(){ 
  8.         console.log(this.x); 
  9.     } 
  10. var foo = newMethod(Foo); 
  11. foo.getX(); 

 

DOM事件處理函數中的this

  1. DOMElement.addEventListener('click'function(){ 
  2.  
  3.   console.log(this); 
  4.  
  5. });  

把函數綁定到DOM事件時,可以當作在DOM上增加一個函數方法,當觸發這個事件時調用DOM上對應的事件方法。

  1. DOMElement.clickHandle = function(){ 
  2.     console.log(this); 
  3. DOMElement.clickHandle(); 

 

普通函數中的this

  1. var x = 1; 
  2. function getX(){ 
  3.     console.log(this.x); 
  4. getX();  

這種情況下,我們創建一個虛擬上下文對象,然后普通函數作為這個虛擬上下文對象的方法調用,此時普通函數中的this就指向了這個虛擬上下文。

那這個虛擬上下文是什么呢?在非嚴格模式下是全局上下文,瀏覽器里是 window ,NodeJs里是 Global ;在嚴格模式下是 undefined 。

  1. var x = 1; 
  2. function getX(){ 
  3.     console.log(this.x); 
  4.  
  5. [viturl context].getX = getX; 
  6. [viturl context].getX(); 

 

閉包中的this

  1. var x = 1; 
  2. var foo = { 
  3.     x: 2, 
  4.     y: 3, 
  5.     getXY: function(){ 
  6.         (function(){ 
  7.             console.log("x:" + this.x); 
  8.             console.log("y:" + this.y);  
  9.         })(); 
  10.     } 
  11. foo.getXY();  

這段代碼的上下文如下圖:

 

這里需要注意的是,我們再研究函數中的 this 指向時,只需要關注 this 所在的函數是如何調用的, this 所在函數外的函數調用都是浮云,是不需要關注的。因此在所有的圖示中,我們只需要關注紅色框中的內容。

因此這段代碼我們關注的部分只有:

  1. (function(){ 
  2.     console.log(this.x); 
  3. })();  

與普通函數調用一樣,創建一個虛擬上下文對象,然后普通函數作為這個虛擬上下文對象的方法立即調用,匿名函數中的 this 也就指向了這個虛擬上下文。

 

參數中的this

  1. var x = 1; 
  2. var foo = { 
  3.     x: 2, 
  4.     getX: function(){ 
  5.         console.log(this.x); 
  6.     } 
  7. setTimeout(foo.getX, 1000);  

函數參數是值傳遞的,因此上面代碼等同于以下代碼:

  1. var getX = function(){ 
  2.     console.log(this.x); 
  3. }; 
  4. setTimeout(getX, 1000);  

然后我們又回到了普通函數調用的問題。

全局中的this

全局中的 this 指向全局的上下文

  1. var x = 1; 
  2. console.log(this.x); 

 

復雜情況下的this

  1. var x = 1; 
  2. var a = { 
  3.     x: 2, 
  4.     b: function(){ 
  5.         return function(){ 
  6.             return function foo(){ 
  7.                 console.log(this.x); 
  8.             }         
  9.         } 
  10.     } 
  11. }; 
  12.  
  13. (function(){ 
  14.     var x = 3; 
  15.     a.b()()(); 
  16. })();  

看到上面的情況是有很多個函數,但我們只需要關注 this 所在函數的調用方式,首先我們來簡化一下如下:

  1. var x = 1; 
  2. (function(){ 
  3.     var x = 3; 
  4.     var foo = function(){ 
  5.         console.log(this.x); 
  6.     } 
  7.     foo(); 
  8. });  

this 所在的函數 foo 是個普通函數,我們創建一個虛擬上下文對象,然后普通函數作為這個虛擬上下文對象的方法立即調用。因此這個 this指向了這個虛擬上下文。在非嚴格模式下是全局上下文,瀏覽器里是 window ,NodeJs里是 Global ;在嚴格模式下是 undefined 。

總結

在需要判斷 this 的指向時,我們可以安裝這種思路來理解:

  • 判斷 this 在全局中OR函數中,若在全局中則 this 指向全局,若在函數中則只關注這個函數并繼續判斷。
  • 判斷 this 所在函數是否作為對象方法調用,若是則 this 指向這個對象,否則繼續操作。
  • 創建一個虛擬上下文,并把this所在函數作為這個虛擬上下文的方法,此時 this 指向這個虛擬上下文。
  • 在非嚴格模式下虛擬上下文是全局上下文,瀏覽器里是 window ,Node.js里是 Global ;在嚴格模式下是 undefined 。

圖示如下: 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2022-07-29 11:06:47

架構開發

2012-12-25 09:38:41

JavaScript設計模式

2020-08-23 11:32:21

JavaScript開發技術

2024-07-18 10:12:04

2022-08-16 09:03:01

JavaScript前端

2020-12-16 09:47:01

JavaScript箭頭函數開發

2011-03-22 09:49:15

JavaScript

2021-01-06 08:03:00

JavaScript數據結構

2015-09-14 15:23:44

JavaScriptfunction

2015-09-02 11:22:36

JavaScript實現思路

2020-10-12 08:35:22

JavaScript

2013-11-05 13:29:04

JavaScriptreplace

2016-11-22 11:08:34

asyncjavascript

2017-11-20 16:17:50

智慧城市

2018-05-10 14:20:18

前端JavaScript深拷貝

2024-06-21 08:32:24

2020-02-20 14:00:15

JavaScript原型原型鏈

2016-09-18 20:53:16

JavaScript閉包前端

2023-02-08 08:47:13

計算機網絡MAC

2021-02-17 11:25:33

前端JavaScriptthis
點贊
收藏

51CTO技術棧公眾號

五月婷婷开心网| 内射中出日韩无国产剧情| 成年人网站在线| 成人黄色在线视频| 国产91在线播放| 久久精品亚洲a| 好吊妞视频这里有精品| 欧美偷拍一区二区| 日韩成人三级视频| 成年人在线观看网站| 国产91在线看| 国产精品无码专区在线观看 | 中文字幕永久在线不卡| 狠狠色噜噜狠狠色综合久| 中文字幕一区二区三区四区免费看| 欧美在线免费| 在线观看国产精品淫| 日本不卡视频一区| 国产精品毛片无码| 91成人在线观看喷潮| 日韩精品在线观看av| 永久免费av在线| 久久久久国产精品厨房| 国产精品免费在线| 国产欧美一级片| 奇米影视一区二区三区小说| 欧美亚洲另类视频| 国产在线视频你懂的| 忘忧草精品久久久久久久高清| 日韩国产在线看| 中文字幕 欧美 日韩| 精品福利在线| 欧美在线短视频| 男人和女人啪啪网站| 手机av在线播放| 国产精品久久久久aaaa| 欧洲一区二区在线| 三级在线观看| 26uuu精品一区二区三区四区在线| 91久久伊人青青碰碰婷婷| 国产一区二区在线视频观看| 日本伊人午夜精品| 国产精品久久久久久网站 | 在线中文字幕不卡| 国产高清精品在线观看| 看黄在线观看| 五月综合激情网| 国产真人做爰毛片视频直播| 福利视频在线| 亚洲摸摸操操av| mm131午夜| av在线免费网址| 亚洲女性喷水在线观看一区| 亚洲综合激情五月| 国产盗摄在线观看| 一区二区三区免费观看| 少妇久久久久久被弄到高潮| 亚洲91av| 午夜不卡av在线| 777米奇影视第四色| 精品国产免费人成网站| 色网综合在线观看| 日本爱爱免费视频| 免费成人黄色网| 91精品免费观看| xxxx视频在线观看| 美女视频免费精品| 亚洲精品乱码久久久久久按摩观| 99久久国产精| 国产一区网站| 久久视频精品在线| 日韩av男人天堂| 久久久久久久高潮| 成人疯狂猛交xxx| 国内精品久久久久久久久久久| 国产99久久久国产精品| 久久精精品视频| 国产在线黄色| 亚洲乱码中文字幕综合| 免费在线观看视频a| 日韩成人av电影| 欧美老女人第四色| 国产国语老龄妇女a片| 天海翼亚洲一区二区三区| 一本一道久久a久久精品逆3p | 国产一级片在线播放| 亚洲欧洲精品一区二区三区| 男人日女人的bb| 亚洲天堂电影| 在线综合亚洲欧美在线视频| 日韩av手机在线播放| 日韩国产综合| 国内精品久久影院| 自拍偷拍色综合| 国产成人综合精品三级| 欧美日韩在线高清| 国产精品久久久久久福利| 偷拍一区二区三区| 一级黄色在线播放| 日韩高清三区| 欧美超级乱淫片喷水| 久久99国产综合精品免费| 国产一区不卡在线| 奇米精品在线| 17videosex性欧美| 欧美巨大另类极品videosbest | 性色av一区二区咪爱| 中文字幕乱码一区二区| 成人精品鲁一区一区二区| 亚洲一区二区三区精品动漫| 多野结衣av一区| 91精品欧美福利在线观看| 成人黄色免费网址| 亚洲精选久久| 不卡的av一区| 超碰人人在线| 欧美日韩一区二区三区四区| 香港三级日本三级| 欧美久久99| 成人乱人伦精品视频在线观看| 日本午夜在线| 亚洲成人av电影在线| 免费人成视频在线播放| 久久美女精品| 国产精品一区二区久久久久| 色就是色亚洲色图| 亚洲成人一区二区| 成人啪啪18免费游戏链接| 久久精品播放| 国产精品久久久久久影视| 日韩毛片在线一区二区毛片| 亚洲小说欧美激情另类| 麻豆免费在线观看视频| 在线免费观看日本欧美爱情大片| 国产欧美韩国高清| eeuss影院在线观看| 色狠狠综合天天综合综合| 亚洲av成人片色在线观看高潮 | 中文在线资源观看网站视频免费不卡| 青青视频在线播放| 日韩手机在线| 2024亚洲男人天堂| 天堂在线视频免费观看| 天天操天天综合网| 久久久久国产精品区片区无码| 99日韩精品| 久久国产精品一区二区三区四区| 在线女人免费视频| 亚洲欧美日韩成人| 国产真人无遮挡作爱免费视频| 久久久一区二区三区捆绑**| 国产成人亚洲精品无码h在线| 免费成人高清在线视频theav| 日本高清视频一区| 国产女主播在线写真| 欧美午夜片在线看| 最新日韩免费视频| 国产在线精品一区二区不卡了| 中文字幕一区二区三区5566| 欧美a在线观看| 欧美极品美女电影一区| 手机看片福利永久| 色噜噜久久综合| 亚洲av熟女国产一区二区性色| 蜜臀va亚洲va欧美va天堂| 国产奶头好大揉着好爽视频| 日韩一级淫片| 欧美在线观看网址综合| 成人午夜影视| 制服视频三区第一页精品| 18精品爽视频在线观看| 久久人人爽人人爽| 美女在线视频一区二区| 好吊一区二区三区| 欧美亚洲另类久久综合| 农村妇女一区二区| 欧美日韩第一页| 亚欧洲精品视频| 欧美色图免费看| 久久国产一级片| 国产亚洲一本大道中文在线| 加勒比av中文字幕| 在线视频日韩| 中国人体摄影一区二区三区| 国产精品xxx在线观看| 国产成人一区二区| 影音先锋男人在线资源| 亚洲欧美色婷婷| 99精品人妻无码专区在线视频区| 婷婷六月综合亚洲| 999福利视频| bt7086福利一区国产| 久久久久国产一区| 狠狠入ady亚洲精品| 四虎永久在线精品免费一区二区| 欧州一区二区三区| 国产精品jizz在线观看麻豆| 欧美xxxbbb| 永久免费精品影视网站| 日韩中文字幕影院| 欧美顶级少妇做爰| 伦av综合一区| 亚洲一区二区三区影院| 最新日韩免费视频| 久久婷婷一区二区三区| 精品国产免费久久久久久婷婷| 日本视频一区二区| 国产九九九九九| 一区二区三区四区电影| 秋霞在线观看一区二区三区| 红杏一区二区三区| 91精品国产综合久久男男| 韩国美女久久| 国内偷自视频区视频综合| 久操视频在线观看| 国产午夜精品全部视频在线播放| 六月婷婷中文字幕| 日韩限制级电影在线观看| 中文字幕无线码一区| 精品日本美女福利在线观看| 青青草原在线免费观看视频| 中文字幕一区二区三区精华液| 亚洲AV无码国产成人久久| 成人动漫av在线| 亚洲精品无码久久久久久久| 久久国内精品视频| 国产原创精品在线| 日本aⅴ免费视频一区二区三区| 国产在线精品91| 在线成人h网| 欧美日韩dvd| 午夜日韩电影| 成人免费看片视频在线观看| 97精品视频| 亚洲欧洲精品一区二区| 国产一区二区三区不卡视频网站| 六十路精品视频| 亚洲成人一品| 免费99视频| 中国av一区| 日韩欧美精品久久| 国产成人影院| 日本10禁啪啪无遮挡免费一区二区 | 91社区在线观看| 日韩中文字幕免费看| 婷婷视频在线| 久久精品国产91精品亚洲| 久久99精品久久久久久野外| 按摩亚洲人久久| 超碰在线观看免费版| 精品中文字幕视频| 国产亚av手机在线观看| 久久久亚洲影院你懂的| av中文资源在线资源免费观看| 国内伊人久久久久久网站视频 | 日本三级韩国三级欧美三级| 欧美激情一区二区三区久久久 | 7777精品久久久大香线蕉小说| 国产一区二区三区视频在线| 亚洲在线视频福利| 北条麻妃一区二区三区在线观看 | 日韩精品二区| 2021国产视频| 日韩视频二区| 美女一区二区三区视频| 精品一区二区三区在线观看国产| 手机看片国产精品| av中文字幕亚洲| 精品欧美一区二区久久久| 国产精品麻豆99久久久久久| 久久久久亚洲av无码专区体验| 亚洲成人动漫一区| 成人小视频在线播放| 欧美剧情片在线观看| 欧美一级免费片| 亚洲人成电影在线观看天堂色| 色影视在线观看| 国内偷自视频区视频综合| 久久xxx视频| 成人黄视频免费| 久久99国内| 操bbb操bbb| 蜜桃av一区| 中文字幕欧美视频| 97成人超碰视| 午夜三级在线观看| 午夜日韩在线观看| 亚洲熟女乱色一区二区三区久久久| 欧美一级xxx| 伦理片一区二区三区| 久久九九国产精品怡红院 | 一本色道88久久加勒比精品| www.日本一区| 99re66热这里只有精品3直播| 欧美乱大交做爰xxxⅹ小说| 亚洲成人高清在线| 一级全黄裸体免费视频| 亚洲精品久久久一区二区三区 | 亚洲最新在线观看| 精品国产www| 亚洲国产精品va在线看黑人 | 亚洲成人精品女人久久久| 国产亚洲欧美日韩美女| xxxx在线视频| 国产一区二区香蕉| 亚洲精品中文字幕99999| 欧美黄网在线观看| 精品在线一区二区三区| 欧美做受xxxxxⅹ性视频| 亚洲国产精品一区二区尤物区| 中文字幕在线播放av| 国产视频丨精品|在线观看| 日本在线视频中文有码| 成人性生交大片免费看小说| 教室别恋欧美无删减版| 欧美牲交a欧美牲交| 高清不卡在线观看| 日本黄色小说视频| 欧美精品v国产精品v日韩精品| 美女欧美视频在线观看免费 | 欧美日韩二三区| 成人性视频免费网站| 91精品一区二区三区蜜桃| 欧美专区亚洲专区| 福利片在线看| 日韩免费观看网站| 精品中文一区| 久草综合在线观看| 国产亚洲制服色| 亚洲av无码不卡| 亚洲欧洲日产国产网站| 英国三级经典在线观看| 国产欧美日韩视频一区二区三区| 激情一区二区| 色哟哟视频在线| 五月激情综合色| 午夜视频免费在线| 97在线免费视频| 亚洲精品国产动漫| 日韩精品一区二区三区不卡| 久久亚洲精品国产精品紫薇| 东京热一区二区三区四区| 亚洲精品自拍偷拍| 男人最爱成人网| 欧洲一区二区在线| 免费成人小视频| 97在线观看免费高| 91精品国产91久久久久久一区二区 | 91免费观看视频在线| 日韩特级黄色片| 国产亚洲美女久久| 在线观看欧美| 4444亚洲人成无码网在线观看| 国产91丝袜在线播放九色| 动漫精品一区一码二码三码四码| 亚洲国产成人久久| 综合毛片免费视频| 亚洲人体一区| 国产精品综合一区二区三区| 精品少妇久久久| 日韩精品电影网| 久久精品黄色| 国产精品88久久久久久妇女| 成人h动漫精品一区二| 波多野结衣啪啪| 日韩一区二区久久久| 一区二区三区视频播放| 亚洲熟妇国产熟妇肥婆| 欧美国产97人人爽人人喊| 国产av无码专区亚洲av| 91国产美女在线观看| 欧美日韩在线二区| 深夜做爰性大片蜜桃| 欧美日韩另类在线| 亚洲成人三级| 国产视频在线观看一区| 丝袜脚交一区二区| 日韩成人短视频| 亚洲精品永久免费| 亚洲福利影视| 自慰无码一区二区三区| 国产精品二三区| 香港一级纯黄大片| 成人美女免费网站视频| 午夜在线精品偷拍| 国产suv一区二区三区| 国产视频亚洲视频| 蜜桃在线一区| 别急慢慢来1978如如2| 一区二区激情视频| 国产一级免费在线观看| 国产精品一区二区免费| 免费观看久久久4p| 91在线看视频| 久久天天躁狠狠躁夜夜躁| 伊人久久综合影院| av不卡中文字幕| 欧美女孩性生活视频| 小早川怜子影音先锋在线观看| 91精品国产毛片武则天|