精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

岛国视频午夜一区免费在线观看| 国产成人精品网址| 亚洲欧美制服另类日韩| 不卡影院一区二区| 97视频精彩视频在线观看| 蜜臀av一区二区在线免费观看 | 1区2区3区国产精品| 亚洲在线一区二区| 国产微拍精品一区| 日韩精品不卡一区二区| 欧美一级在线观看| 免费观看美女裸体网站| 岛国最新视频免费在线观看| 国模少妇一区二区三区| 韩国视频理论视频久久| 国产jjizz一区二区三区视频| **日韩最新| 欧美日韩精品二区| 在线观看精品视频| 乱精品一区字幕二区| 久久久水蜜桃av免费网站| 精品国产一区二区三区久久久| 黄色激情在线观看| 国产精品成人国产| 香蕉影视欧美成人| 中文字幕av日韩精品| 天天色综合av| 国产一区二区三区四区在线观看| 奇米四色中文综合久久| 日本妇女毛茸茸| 国产精品密蕾丝视频下载| 日韩午夜中文字幕| 久久99999| 国产理论在线| 亚洲色图视频免费播放| 日韩免费av一区二区三区| 亚洲精品视频91| 麻豆国产欧美一区二区三区| 88xx成人精品| 久久成人在线观看| 亚洲成人精品| 在线播放日韩欧美| 国产精品jizz| 国产无遮挡裸体免费久久| 777色狠狠一区二区三区| 日韩精品无码一区二区三区免费| av中文字幕在线看| 一区二区高清免费观看影视大全| 亚洲欧洲国产精品久久| 久久手机免费观看| 26uuu精品一区二区在线观看| 999国产在线| 92久久精品一区二区| 日韩国产欧美在线视频| 欧美影院在线播放| 日韩av在线播| 欧美日韩福利| 美日韩精品免费视频| 日本成人免费在线观看| 精品免费在线| 亚洲人成自拍网站| 97超碰在线免费观看| 免费日韩一区二区三区| 亚洲成人av在线播放| 亚洲乱妇老熟女爽到高潮的片| 韩国三级成人在线| 欧美一区二区三区视频免费| 在线视频一二区| 国产日本亚洲| 欧美一区二区三区系列电影| 日韩av影视大全| 国产中文欧美日韩在线| 日韩午夜在线观看| 免费黄色在线播放| 久久动漫网址| 国产丝袜一区二区| 真实乱视频国产免费观看| 国产一区二区三区四区大秀| 亚洲四色影视在线观看| 亚洲а∨天堂久久精品2021| 成人中文在线| www.欧美精品一二三区| 91精品一区二区三区蜜桃| 亚洲综合专区| 色综合色综合久久综合频道88| 欧美日韩国产精品一区二区三区| 欧美精品偷拍| 国内外成人免费激情在线视频网站 | 国产无遮挡裸体免费视频| 极品中文字幕一区| 欧美一区二区三区精品电影| 无码人妻丰满熟妇奶水区码| 美女视频黄久久| 18成人在线| 欧美熟妇交换久久久久久分类 | 神马午夜一区二区| 久久综合九色综合欧美98| 婷婷久久五月天| 老司机午夜在线| 亚洲一二三四区不卡| 凹凸国产熟女精品视频| 国产成人午夜性a一级毛片| 欧美一区二区三区四区五区| 国产精品果冻传媒| 国内精品久久久久久久久电影网 | 国产精品一二三视频| 一级片视频网站| 成人免费看视频| 日本亚洲导航| 1stkiss在线漫画| 丁香五六月婷婷久久激情| 日韩欧美国产片| 国产ts一区| 中文字幕在线看视频国产欧美在线看完整 | 日韩亚洲欧美中文字幕| 欧美日韩免费观看一区=区三区| 欧美亚洲在线观看| 97超碰人人草| 91免费观看视频| 欧美 国产 精品| 欧美大片高清| 日韩一区二区不卡| 国产精品免费无码| 日韩亚洲精品在线| 亚洲va欧美va国产综合剧情| 久草在线网址| 亚洲午夜电影在线观看| 国产一伦一伦一伦| 欧美日韩播放| 欧美精品久久久久久久| 一本到在线视频| 91色porny蝌蚪| 久久人妻无码一区二区| 亚洲日韩中文字幕一区| 亚洲欧美国产精品久久久久久久| 黄色一级片在线免费观看| 免费人成黄页网站在线一区二区 | 中国av一区| 久久久久久国产免费| 99热这里只有精品在线观看| 国产日本一区二区| 玩弄中年熟妇正在播放| 美女久久精品| 色偷偷偷综合中文字幕;dd| 久久久久久少妇| 成人av电影在线观看| 米仓穗香在线观看| 亚洲男男av| 色综合伊人色综合网站| 国产精华7777777| 91网页版在线| 日韩在线视频在线观看| 欧美调教在线| 国模视频一区二区| 蜜臀av午夜精品| 一区二区三区精品| 女王人厕视频2ⅴk| 欧美激情五月| 91传媒视频在线观看| 国产成人午夜| 欧美一区二区在线观看| 夫妻性生活毛片| 国产一区二区精品久久99| 红桃一区二区三区| 天堂va欧美ⅴa亚洲va一国产| 久久亚洲精品一区二区| 国产精品美女一区| 亚洲精品免费一二三区| gogo亚洲国模私拍人体| 欧美久久九九| 国产精品美女xx| 97超碰在线免费| 亚洲乱码国产乱码精品精| 亚洲欧美日韩激情| 日本一区二区三级电影在线观看| 成年网站在线播放| 91精品久久久久久久蜜月| 91成人免费观看| 九色porny视频在线观看| 日韩精品中文字幕视频在线| 好吊色在线视频| 国产精品丝袜久久久久久app| 亚洲欧美视频二区| 欧美精品日本| 久久综合伊人77777麻豆| 国产v综合v| 久久精品亚洲一区| 亚洲国产一二三区| 日韩欧美视频一区二区三区| 亚洲天堂岛国片| 国产一区二区在线观看视频| 国产美女主播在线| 国产一区二区三区不卡视频网站| 成人黄色片网站| 黄色羞羞视频在线观看| 日韩激情片免费| 一区二区小视频| 一片黄亚洲嫩模| 精品国产无码在线观看| 精品一二三四在线| av免费观看大全| 日韩久久视频| 国产高清一区视频| 日韩欧美精品电影| 九九热这里只有精品6| 天堂av在线7| 欧美日韩国产综合一区二区三区 | 日本精品在线观看| 91国偷自产一区二区三区的观看方式| 福利在线播放| 精品久久久久久久久久久久久久久久久 | 亚洲精品66| 国语自产精品视频在线看一大j8 | www.26天天久久天堂| 欧美激情视频一区二区| av在线电影播放| 亚洲国产又黄又爽女人高潮的| 中文在线资源天堂| 精品久久久久久久久中文字幕| 男人晚上看的视频| 久久免费精品国产久精品久久久久| 亚洲一二三不卡| 日日骚欧美日韩| a级黄色小视频| 国产国产精品| 色播亚洲视频在线观看| 欧美交a欧美精品喷水| 3d动漫精品啪啪一区二区三区免费 | 日本少妇毛茸茸高潮| 国产精品久久久久久久久免费相片 | 亚洲美女15p| 91在线播放视频| 久久亚洲精品人成综合网| 日本精品va在线观看| 女同一区二区免费aⅴ| 久久精品视频播放| 成人18在线| 亚洲人成电影网站色xx| 日本久久一级片| 日韩三级.com| ,亚洲人成毛片在线播放| 色域天天综合网| 91美女免费看| 亚洲高清久久久| 免费一级片在线观看| 亚洲视频1区2区| 波多野结衣在线网址| 亚洲欧美综合网| 黄色激情小视频| 欧美极品aⅴ影院| 一级黄色性视频| 2023国产一二三区日本精品2022| youjizz.com日本| 大白屁股一区二区视频| 欧洲成人午夜精品无码区久久| 国产美女娇喘av呻吟久久| 免费av不卡在线| 久久99精品久久久久久动态图| 色哟哟精品视频| 免费观看日韩电影| 久久99爱视频| 精品一区二区三区不卡| 久久久久久久久久久久久久久国产| 日本视频在线一区| 亚洲视频一二三四| 韩国一区二区三区| 真实乱偷全部视频| 国产成人午夜电影网| 欧美图片自拍偷拍| av不卡一区二区三区| 中文乱码人妻一区二区三区视频| 91美女在线观看| 国产在线观看h| 国产精品进线69影院| 天天鲁一鲁摸一摸爽一爽| 一区二区三区日韩在线观看| 久青草视频在线观看| 亚洲超碰精品一区二区| 伊人中文字幕在线观看| 欧美午夜一区二区三区免费大片| 亚洲天堂avav| 日韩视频在线你懂得| 四虎影院在线域名免费观看| 亚洲人永久免费| 香蕉视频网站在线观看| 欧美乱大交xxxxx| 欧美激情护士| 国产欧美在线观看| 亚洲一区二区免费在线观看| 久久亚洲高清| 成人网18免费网站| 99re6这里有精品热视频| 亚洲人成人一区二区三区| www.超碰com| 国产一区二区三区免费播放 | 成人在线免费av| 97超级碰碰| 亚洲欧美tv| 亚洲综合激情五月| 国产精品久久777777毛茸茸| 五月天激情视频在线观看| 国产成人h网站| 欧美特黄一区二区三区| 一区二区三区在线观看网站| 视频一区二区三区四区五区| 欧美老女人在线| 日本波多野结衣在线| 色先锋资源久久综合5566| xxxcom在线观看| 国产伦精品免费视频| 看全色黄大色大片免费久久久| 亚洲国产精品一区二区第一页 | 久久经典综合| 国产一区二区在线观看免费视频| 93久久精品日日躁夜夜躁欧美 | 亚洲女与黑人做爰| 日本一区二区三区精品| 欧美一区二区视频在线观看| 免费av在线电影| 国内精品模特av私拍在线观看| 日韩黄色在线| 欧美一级片免费观看| 激情久久久久| 久久6免费视频| 国产日韩欧美a| 天天操天天干视频| 日韩欧美一区二区在线视频| 成人在线高清视频| 欧美一区二三区| 国产成人精品福利| 2021国产视频| 精品综合免费视频观看| 国产亚洲精品熟女国产成人| 午夜精品免费在线| 性少妇videosexfreexxx片| 日韩中文字幕免费视频| 成人免费一区| 欧美日韩三区四区| 国产精品入口| www.啪啪.com| 亚洲香蕉伊在人在线观| 精品国产av一区二区| www.亚洲一区| 99久久婷婷国产综合精品首页| 免费观看成人高| 日韩视频一区二区三区在线播放免费观看| 日韩成人av免费| 国产精品亲子伦对白| 中文在线字幕免费观| 在线观看亚洲区| 亚洲承认视频| 欧美日韩电影一区二区三区| 国产欧美日韩亚洲一区二区三区| 人妻av一区二区| 亚洲福利一区二区三区| 黄色av中文字幕| 欧美极品在线播放| 成人av资源网址| 成人小视频在线观看免费| 国产精品亚洲第一| 久久久久人妻一区精品色欧美| 日韩欧美综合一区| 高清电影在线观看免费| 国产精品免费一区二区三区观看| 狠狠爱综合网| 少妇被狂c下部羞羞漫画| 亚洲高清免费一级二级三级| 天堂а√在线8种子蜜桃视频| 欧美综合激情网| 国产一区二区电影在线观看| 亚洲欧美自偷自拍另类| 亚洲色图欧洲色图| 亚洲精品成人电影| 91精品国产高清久久久久久久久| 日韩极品少妇| 99视频精品免费| 国产精品免费免费| 99精品在线视频观看| 久久久久在线观看| 亚洲尤物av| 国产精品区在线| 亚洲精品美国一| 亚洲av片一区二区三区| 国产成人精彩在线视频九色| 99久久精品费精品国产| 9.1在线观看免费| 色婷婷久久久久swag精品| 日韩伦理在线观看| 国产传媒一区二区| 亚洲综合国产| 波多野结衣家庭教师在线观看 | 欧美国产日韩视频| 偷拍亚洲精品| 天堂av在线网站| 亚洲一二三四久久| gogogo高清在线观看免费完整版| 亚洲精品欧美日韩专区| 国产日韩欧美在线播放不卡| 中文字幕第24页| 日韩精品一区二区三区视频播放|