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

Know this, use this! (總結 this 的常見用法)

開發 開發工具
在了解this之前,相信大家都應該會知道作用域這個知識點的存在,函數在創建之后,會構建自己的執行環境以及作用域,這是一開始就確定了。但是實際的上下文(context)環境,也可以理解為就是this,它是動態確定的,即在函數運行時才確定this所指向的對象,而非聲明時所指向的對象。

[[170676]]

this應該是一個討論了很久的話題了。其中,關于this的文章,在很多的博客當中也有很多介紹,但是,以前我都是一知半解的去了解它,就是看博客當中,只介紹了一些情況下的 this 的使用方式,但是也并沒有自己去做過總結。剛好是在掘金當中有看到一篇關于this的一些詳細文章,文末會附上鏈接以及英文原文,這里純粹是自己進行一個總結,以后方便自己進行回顧以及加深印象。希望這篇文章對于你了解this有一定的幫助,文末還有一些練習題噢~希望真的對你們有幫助。(因為寫項目過程中,一直被 this 坑過,卻找了很久的 bug ,我真是 樂了狗)

在了解this之前,相信大家都應該會知道作用域這個知識點的存在,函數在創建之后,會構建自己的執行環境以及作用域,這是一開始就確定了。但是實際的上下文(context)環境,也可以理解為就是this,它是動態確定的,即在函數運行時才確定this所指向的對象,而非聲明時所指向的對象。

關于this,總結起來,主要有以下幾個途徑能夠被運用到。

1 對象方法中調用this

如果函數被當中對象的一個方法進行調用,則this值指向該對象。

  1. var person = { 
  2.     name'Alice'
  3.     sayName: function() { 
  4.         alert('welcome ' + this.name); 
  5.     } 
  6.  
  7. person.sayName();    // this == person, alert: 'welcome Alice' 

 在這里,函數的this指向該對象(即 person);但是有一點需要注意,就是當對象的方法被賦予給一個變量時,其則變為了函數觸發,此時的this為 window 或者 undefined(嚴格模式下),如下:

  1. var name = 'Bob'
  2. var person;    // 即上面的定義,此不拓展詳細,直接使用 
  3.  
  4. var say = person.sayName;    // this == window || undefined 
  5. say();    // 'welcome Bob' || throw an error: Cannot read property 'name' of undefined(...) 

 2 函數內部使用

在函數內部當中使用了 this,即函數被當做方法使用,不同于 1 當中作為對象的方法使用,此時調用,是在全局作用域下進行調用,即在window下進行調用,由定義可以知道,在全局作用域下聲明一個函數,其自動加為window的一個屬性。this此時名正言順的會指向window,嚴格模式下為 undefined

  1. function sayThis() { 
  2.     alert(this == window);    // true 

 結合第一點,函數作為對象的一個方法使用,這里存在一個小坑,即閉包,啥是閉包,這個在這里就不扯開了,最簡單的理解就是Function that returns function,如果不理解什么是閉包的話,可以去翻翻 《JavaScript 高級程序設計》第七章關于閉包的相關內容。第一點當中存在一個小坑,就是將對象的方法賦予給一個變量的時候,其變為函數觸發,此時的 this 實際上是指向 window(非嚴格模式)。

那么,當函數中返回一個函數,此時在對象當中調用該方法,其就相當于是函數觸發,此時的 this,在不做任何上下文綁定的前提之下,其指向 window(非嚴格模式)。

  1. var name = 'Bob'
  2.     person = { 
  3.         name'Alice'
  4.         sayName: function() { 
  5.             console.log(this === person);    // true 
  6.             return function() { 
  7.                 console.log(this === person);    // false 
  8.                 console.log(this === window);    // true 
  9.                 console.log(this.name);          // Bob 
  10.             }; 
  11.         } 
  12.     }; 
  13.  
  14. person.sayName()(); 

 當然,要解決這個問題的方法,很簡單,就是給他綁定一個上下文。

  1. var name = 'Bob'
  2.     person = { 
  3.         name'Alice'
  4.         sayName: function() { 
  5.             console.log(this === person);    // true 
  6.             return function() { 
  7.                 console.log(this === person);    // true 
  8.                 console.log(this === window);    // false 
  9.                 console.log(this.name);          // Alice 
  10.             }.bind(this); 
  11.         } 
  12.     }; 
  13.  
  14. person.sayName()(); 

 3 new 當中進行使用

我們知道在使用 new 方法創建對象的時候,會經過如下這些個過程:

  • 創建對象,將 this 值賦予新的對象
  • 調用構造函數,為 this 添加屬性和方法
  • 返回 this 給當前的對象
  1. function Person(name, age) { 
  2.     this.name = name
  3.     this.age = age; 
  4.  
  5. var person1 = new Person('Alice', 29); 
  6. console.log(person1.name);    // Alice 

 這里要記得使用 new 運算符,否則,其只能算是普通的調用,而不是創建一個新的實例對象。而當做普通函數調用的話,實際上即 第 2 種情況下,對函數普通調用,此時的 this 指向 window

  1. function Person(name, age) { 
  2.     this.name = name
  3.     this.age = age; 
  4.     return this; 
  5.  
  6. var person1 = Person('Alice', 29); 
  7. console.log(person1.name);    // Alice 
  8. console.log(window.name);     // Alice 
  9. console.log(person1 === window);    // true 

 這是正常情況下,this 會正確返回并且指向該對象,但是在構造函數當中,如果返回了一個對象,那么 this 會指向返回的那個對象。

  1. function Person(name, age) { 
  2.     this.name = name
  3.     this.age = age; 
  4.     return { 
  5.         name'Bob' 
  6.     }; 
  7.  
  8. var person1 = new Person('Alice'); 
  9. console.log(person1.name);    // Bob 
  10. console.log(person1.age);     // undefined 

 題外話,類似的,聯想到 var a = new Person(),則 a instanceof Person一定返回 true嗎?留給你們想一想咯。

4 使用 call、apply 或 bind 改變 this

在引用類型 Function當中,函數存在兩個方法屬性,call 和 apply,在 ECMAScript5當中,加入了 bind 方法。題外話,他們三者區別,應該都知道了吧,不知道的加緊補習呀。

  1. var name = 'Bob'
  2. var person = { 
  3.     name'Alice'
  4.     age: 29 
  5.  
  6. function sayName() { 
  7.     console.log(this.name); 
  8.  
  9. sayName.call(person);    // Alice 

 這里是使用了 call 方法來改變了 this的執行環境,至于使用 apply,效果一樣,只是二者差別在于傳入參數的不同。

  1. func.call(context, arg1, arg2, ...) 
  2. func.apply(context, [arg1, arg2, ...]) 

 使用 bind 方法進行上下文的改變,bind 方法與 call 和 apply有著本質的不同,其不同點是,bind()函數返回的是一個新的函數,即方法,而后兩者則都是立即執行函數,使用的時候即調用了該函數,返回方法操作的結果。

并且,使用 bind()方法創建的 上下文,其為永久的上下文環境,不可修改,即使是使用 call 或者 apply方法,也無法修改 this所指向的值。

  1. var name = 'Bob'
  2. var person = { 
  3.     name'Alice'
  4.     age: 29 
  5.  
  6. function sayName() { 
  7.     console.log(this.name); 
  8.  
  9. var say = sayName.bind(person); 
  10. say();        // Alice 
  11. sayName();    // Bob 

 5 箭頭函數

箭頭函數并不創建其自身的上下文,其上下文 this,取決于其在定義時的外部函數。

并且,箭頭函數擁有靜態的上下文,即一次綁定之后,便不可再修改,即使是用了 第 4 種用途當中的改變上下文的方法,也不為之動容。

  1. var num = [1, 2, 3]; 
  2.  
  3. (function() { 
  4.     var showNumber = () => { 
  5.         console.log(this === num);    // true 
  6.         console.log(this);            // [1, 2, 3] 
  7.     } 
  8.     console.log(this === num);        // true 
  9.     showNumber();                     // true && [1, 2, 3] 
  10.     showNumber.call([1, 2]);          // true && [1, 2, 3] 
  11.     showNumber.apply([1, 2]);         // true && [1, 2, 3] 
  12.     showNumber.bind([1, 2])();        // true && [1, 2, 3] 
  13. }).call(num); 

 由于箭頭函數的外部決定上下文以及靜態上下文等的特性,不太建議使用箭頭函數在全局環境下來定義方法,因為不能通過其他方法改變其上下文。這很蛋疼。 

  1. function Period (hours, minutes) {   
  2.     this.hours = hours; 
  3.     this.minutes = minutes; 
  4. Period.prototype.format = () => {   
  5.     console.log(this === window);    // => true 
  6.     return this.hours + ' hours and ' + this.minutes + ' minutes'
  7. }; 
  8. var walkPeriod = new Period(2, 30);   
  9. console.log(walkPeriod.hours); 
  10. walkPeriod.format();    // => 'undefined hours and undefined minutes'  

此時的 this 實際上是指向了 window,所以 this.hours 和 this.minutes實際上沒有聲明的,故為 undefined。

在全局環境下,還是選用 函數表達式 來進行函數的定義,可以保證正確的上下文環境

  1. function Period (hours, minutes) {   
  2.     this.hours = hours; 
  3.     this.minutes = minutes; 
  4. Period.prototype.format = function() {   
  5.     console.log(this === walkPeriod);    // => true 
  6.     return this.hours + ' hours and ' + this.minutes + ' minutes'
  7. }; 
  8. var walkPeriod = new Period(2, 30);   
  9. walkPeriod.format(); // '2 hours and 30 minutes'  

練習

  1. // 練習1 
  2. var func = (function(a) { 
  3.     this.a = a; 
  4.     return function(a) { 
  5.         a += this.a; 
  6.         return a; 
  7.     } 
  8. })(function(a, b) { 
  9.     return a; 
  10. }(1, 2)) 
  11.  
  12. func(4) // ? 
  13.  
  14. // 練習2 
  15. var x = 10, 
  16.     foo = { 
  17.         x: 20, 
  18.         bar: function() { 
  19.             var x = 30; 
  20.             return this.x; 
  21.         } 
  22.     } 
  23.  
  24. console.log(foo.bar()); 
  25. console.log((foo.bar)()); 
  26. console.log((foo.bar = foo.bar)()); 
  27. console.log((foo.bar, foo.bar)());  

希望看完這篇文章,這兩個練習題,你是能夠做出來的呀~ 好好分析一下唄。如果不確定的話,可以在留言板上,咱們相互討論一下呀

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

2010-07-23 15:17:43

Perl use

2010-06-02 13:24:02

SVN用法

2025-07-02 07:05:00

多線程Java開發

2011-03-16 09:42:27

Oracle臨時表

2010-04-28 16:30:52

Oracle case

2011-05-31 14:33:53

settimeout

2010-08-12 09:25:35

Flex控件

2010-07-23 14:12:14

Perl Hash

2010-07-26 14:45:17

Perl Hash

2022-07-26 09:16:51

Python分支語句

2024-07-29 13:50:58

Linuxdig命令

2013-10-18 16:51:36

前端安全javascript代碼安全

2021-04-29 07:46:55

Redis業務數據

2013-01-07 10:14:06

JavaJava枚舉

2009-08-20 17:17:02

C#哈希表

2011-04-07 16:34:05

staticC++

2011-04-19 16:38:00

對象指針指針C++

2021-07-29 10:08:15

NumPy索引切片

2010-07-28 10:38:29

Flex開源框架

2011-10-08 15:49:52

Java
點贊
收藏

51CTO技術棧公眾號

国产一区二区三区在线观看视频| 国产精品资源在线观看| 亚洲乱码一区二区| 亚洲一级免费在线观看| 在线中文字幕第一页| 不卡电影一区二区三区| 国产精品久在线观看| jizz亚洲少妇| 国产成人精品三级高清久久91| 欧美精品视频www在线观看| 免费一级淫片aaa片毛片a级| 精品影院一区| 成人晚上爱看视频| 国产精品视频成人| 福利一区二区三区四区| 97精品国产| 亚洲欧美日韩久久久久久 | 国产精品婷婷| 综合av色偷偷网| 国产美女喷水视频| 日韩精品中文字幕吗一区二区| 色综合久久综合网欧美综合网| 成人性做爰片免费视频| 久久久资源网| av男人天堂一区| 99热在线播放| 国产精品综合在线| 另类欧美日韩国产在线| 日本精品久久久| 久久精品www| 五月开心六月丁香综合色啪| 亚洲欧洲一区二区三区在线观看| 99久久久无码国产精品性波多| 久久免费资源| 欧美影院午夜播放| 久久久久免费精品| 日韩电影毛片| 亚洲第一搞黄网站| 亚洲精品天堂成人片av在线播放| 尤物网在线观看| 久久日韩粉嫩一区二区三区| 国产一区二区高清不卡 | 亚洲老板91色精品久久| 韩国av中国字幕| 精品国产乱码一区二区三区| 欧美日韩精品高清| 视频二区在线播放| 亚洲国产黄色| 久久精品99国产精品酒店日本| 亚洲av无码成人精品国产| 亚洲精品18| 日韩一区二区三区观看| 韩国三级丰满少妇高潮| 国产精品久久久久久久久久辛辛 | 精品国内亚洲在观看18黄| 久久婷婷五月综合| 欧美丝袜激情| 中文字幕在线看视频国产欧美在线看完整| 久久久亚洲av波多野结衣| 久草在线综合| 日韩av中文字幕在线免费观看| 俄罗斯黄色录像| 福利在线一区| 日韩成人av一区| 免费观看av网站| 国产一区二区精品久| 在线观看视频99| 国产精品1区2区3区4区| 99精品网站| 欧美成人精品一区| 国产91av视频| 媚黑女一区二区| 国产精品狼人色视频一区| 中文字幕在线观看第二页| 久久99热这里只有精品| 91探花福利精品国产自产在线| 精品国产亚洲AV| 成人av手机在线观看| 欧美高清视频一区二区三区在线观看| 欧美另类自拍| 国产精品成人一区二区艾草 | 欧美丰满艳妇bbwbbw| 亚洲精品婷婷| 国产精品久久久久久久久男| 国产美女三级无套内谢| 成人免费视频免费观看| 欧美亚洲国产免费| 成a人片在线观看| 亚洲成av人片在线| 国产天堂在线播放| 精品中文在线| 亚洲美女久久久| 中文字幕在线观看2018| 制服诱惑一区二区| 成人黄色av免费在线观看| 殴美一级特黄aaaaaa| 久久精品亚洲精品国产欧美kt∨ | 草莓视频丝瓜在线观看丝瓜18| 欧美日韩综合视频| 亚洲综合伊人久久| 香蕉一区二区| 欧美成人免费全部| 日韩黄色一级视频| 高清av一区二区| 亚洲成人a**址| hd国产人妖ts另类视频| 欧美日韩激情一区二区| www.日本高清| 亚洲va在线| 日韩av大片免费看| 亚洲AV无码乱码国产精品牛牛| 91麻豆精品在线观看| 日韩中文在线字幕| 户外露出一区二区三区| 精品国产一区久久| 久久久久久久久久97| 男人天堂欧美日韩| 国产乱人伦精品一区二区| 免费av不卡| 在线观看亚洲一区| 7788色淫网站小说| 国内揄拍国内精品久久| 国产在线播放不卡| a天堂在线资源| 精品欧美一区二区三区| 白丝校花扒腿让我c| 日韩精品dvd| 国产激情999| 欧美日韩免费做爰大片| 亚洲国产精品麻豆| 亚洲天堂av一区二区三区| 色婷婷色综合| 国产精品第8页| 蝌蚪视频在线播放| 色狠狠桃花综合| av网站免费在线播放| 99成人在线| 国产欧美一区二区在线播放| 欧美午夜大胆人体| 欧美男人的天堂一二区| 免费黄色在线网址| 青青草原综合久久大伊人精品优势| 久久久婷婷一区二区三区不卡| 不卡的av影片| 精品国产免费一区二区三区香蕉 | 色的视频在线免费看| 91久久人澡人人添人人爽欧美| 国产精品300页| 国产精品日韩久久久| 久久久久久国产精品mv| 国产在线美女| 国产丝袜一区二区三区| 中文字幕在线播| 欧美韩国日本综合| 奇米影视四色在线| 91成人免费| 99蜜桃在线观看免费视频网站| bl在线肉h视频大尺度| 亚洲变态欧美另类捆绑| 亚洲一区欧美在线| 久久久久久久久久久黄色| 97公开免费视频| 日韩欧美电影| 91香蕉电影院| a天堂资源在线| 尤物九九久久国产精品的特点| 亚洲高清视频免费观看| 中文字幕制服丝袜一区二区三区 | 一二三四视频社区在线| 日韩成人av在线资源| 国产成人精品a视频一区www| 在线日本中文字幕| 日韩三级视频中文字幕| 国产精品7777777| 国产欧美日韩中文久久| 国产精品久久久久久久av福利| 午夜国产精品视频| 快播日韩欧美| 日韩第二十一页| 欧美高清在线观看| 欧美成人免费| 日韩免费在线观看| 亚洲黄色激情视频| 综合av第一页| 黄色污在线观看| 激情综合色播激情啊| 成年人网站国产| 教室别恋欧美无删减版| 亚洲最大成人在线| 成人影院av| 欧美成在线视频| 噜噜噜在线观看播放视频| 日韩一区二区三区电影| 日本中文字幕在线免费观看| 中文字幕一区二区三区不卡在线| 午夜剧场免费看| 美女一区二区视频| 热99这里只有精品| 91精品久久久久久久久久不卡| 狠狠爱一区二区三区| av日韩久久| 欧洲成人午夜免费大片| 日本小视频在线免费观看| 亚洲品质视频自拍网| 性欧美videos另类hd| 欧洲另类一二三四区| 日韩成人免费在线视频| 亚洲丝袜自拍清纯另类| 性猛交娇小69hd| 97久久人人超碰| 人妻换人妻仑乱| 日本人妖一区二区| www.浪潮av.com| 黄色亚洲精品| 性欧美精品一区二区三区在线播放| 懂色av一区二区| 成人免费福利在线| 国产精品亚洲一区二区三区在线观看| 久久人人97超碰精品888| av文字幕在线观看| 日韩在线视频播放| 国产黄在线观看免费观看不卡| 亚洲黄色www| 亚洲精品字幕在线| 7777精品伊人久久久大香线蕉最新版| 天堂а√在线中文在线新版| 亚洲一二三区不卡| 久久久久99精品成人片试看| 国产精品美女久久久久久久久久久 | 亚洲一区二区三区免费看| 国产成人一区| 欧美高清性xxxxhd | 国产精品1024久久| 韩国三级丰满少妇高潮| 国产乱一区二区| 日本特黄在线观看| 国产综合久久久久久鬼色| 国产日韩欧美久久| 美女视频网站久久| 欧美午夜aaaaaa免费视频| 肉肉av福利一精品导航| aa在线免费观看| 校园激情久久| 99免费视频观看| 日本v片在线高清不卡在线观看| 日本成人在线免费视频| 久久久久国产一区二区| 无码人妻丰满熟妇区五十路百度| 香蕉久久久久久久av网站| www.爱色av.com| 免费永久网站黄欧美| 毛片av免费在线观看| 日韩影院在线观看| 性欧美videossex精品| 久热成人在线视频| 91人妻一区二区三区| 国产成人av电影| 风间由美一二三区av片| 久久久精品国产免费观看同学| 色一情一交一乱一区二区三区| 国产三区在线成人av| 手机av在线不卡| 一区二区视频在线| 国产高潮久久久| 欧美日韩国产乱码电影| 国产日韩一级片| 亚洲国产成人在线视频| 欧美男男激情freegay| 色综合亚洲精品激情狠狠| xvideos国产在线视频| 久久久久久91| 久久xxx视频| 91亚洲精品视频| 免费萌白酱国产一区二区三区| 日本在线观看不卡| 久久久久久久久久久妇女| 99国产精品白浆在线观看免费| 一区二区三区福利| www.亚洲高清| 国产99久久久国产精品免费看| 大地资源二中文在线影视观看| 国产农村妇女毛片精品久久麻豆 | 国产亚洲依依| 欧美精品在线观看| 亚洲最大网站| 91美女高潮出水| 羞羞色国产精品网站| 最新欧美日韩亚洲| 99国产精品99久久久久久粉嫩| 国产原创精品在线| 成人av网站在线观看| 疯狂撞击丝袜人妻| 精品成人av一区| 一级黄色大毛片| 亚洲毛片在线观看.| 亚洲区欧洲区| 国产精品国产三级国产aⅴ9色| 亚洲国产欧美国产第一区| 欧美人xxxxx| 欧美特黄a级高清免费大片a级| 国产精品亚洲二区在线观看| 国产乱对白刺激视频不卡| 美女爆乳18禁www久久久久久 | 久久午夜羞羞影院免费观看| www.毛片com| 欧美亚洲国产一区在线观看网站| 成人精品在线播放| 久久久国产视频| 亚洲一区二区三区四区| 国产伦精品一区二区三区视频免费| 日韩黄色大片| 久久亚洲综合国产精品99麻豆精品福利 | 亚洲精品免费一区亚洲精品免费精品一区 | 欧美一级裸体视频| 美女一区二区视频| 一级黄色片大全| 午夜视频一区在线观看| 国产日韩欧美一区二区东京热| 国产亚洲免费的视频看| 国产高清中文字幕在线| **亚洲第一综合导航网站| 精品亚洲成人| 国产免费黄色一级片| 国产成人午夜99999| 久久精品亚洲a| 欧美视频中文字幕| 国产小视频在线| 欧美一区二三区| 美腿丝袜亚洲图片| 亚洲熟妇无码av在线播放| 国产精品自拍毛片| 国产一二三四区| 7777精品伊人久久久大香线蕉经典版下载 | 精品国产午夜| 粗暴91大变态调教| 久久人人爽爽爽人久久久| 亚洲日本韩国在线| 日韩高清免费在线| 日本在线影院| 欧美精品二区三区四区免费看视频 | 思热99re视热频这里只精品| 国产欧美精品aaaaaa片| 国产高清久久久| 极品盗摄国产盗摄合集| 日韩一区二区三区视频| av在线免费网址| 亚洲自拍偷拍色片视频| 欧美在线免费| 99免费观看视频| 亚洲aⅴ怡春院| 清纯唯美亚洲色图| 日产精品99久久久久久| 欧美视频免费| 五月天婷婷影视| 亚洲精品国久久99热| 乱色精品无码一区二区国产盗| 久久久免费电影| 日韩免费电影在线观看| 无码人妻丰满熟妇区五十路百度| 久久久久国产精品厨房| 在线视频1卡二卡三卡| 精品国产欧美成人夜夜嗨| 欧美另类中文字幕| 一二三四视频社区在线| 久久精品网站免费观看| 91成人一区二区三区| 欧美www在线| 精品淫伦v久久水蜜桃| av免费网站观看| 中文字幕一区二区5566日韩| 性猛交xxxx乱大交孕妇印度| 国自在线精品视频| 精品国产一区二区三区久久久樱花 | 中文字幕成人在线| 免费精品一区二区三区在线观看| 国产黄色片免费在线观看| 国产欧美精品在线观看| 精品久久人妻av中文字幕| 欧美在线视频网站| 日本精品黄色| fc2成人免费视频| 欧洲av在线精品| 黄色影院在线看| 视频在线精品一区| 成人午夜在线免费| 在线视频精品免费| 欧美美女15p| 热久久天天拍国产| 亚洲一区二区三区黄色| 在线一区二区三区四区| 欧美性爽视频| 亚洲综合视频一区| 99久久久精品| 国产免费久久久| 国产ts人妖一区二区三区| 欧美淫片网站| 欧美日韩中文字幕视频| 亚洲高清av在线| 国产成人视屏| 99久久国产宗和精品1上映|