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

欧美色图五月天| 999福利在线视频| 麻豆国产精品一区二区三区 | 精品少妇一区二区三区免费观| 福利影院在线看| 国产精品水嫩水嫩| 国产精品入口免费| 无码久久精品国产亚洲av影片| 亚洲人metart人体| 亚洲欧美日韩中文在线| a级大片免费看| 韩国美女久久| 亚洲综合网站在线观看| 日韩欧美在线观看强乱免费| 成人av无码一区二区三区| 久久久蜜桃一区二区人| 久久99国产精品自在自在app| 国产精品毛片一区二区| 日韩亚洲精品在线观看| 91福利在线观看| 搞av.com| 国产精品剧情一区二区在线观看| 久久久777精品电影网影网 | 久久久久久噜噜噜久久久精品| 精品无码国产污污污免费网站| 伊色综合久久之综合久久| 欧美自拍偷拍午夜视频| 日韩欧美国产综合在线| 成人影院在线看| 欧美极品另类videosde| 九九99久久| 亚洲欧美强伦一区二区| 精品亚洲国内自在自线福利| 国产成人在线视频| 日本va欧美va国产激情| 激情丁香综合| 精品少妇v888av| 永久免费看黄网站| 欧美aaaa视频| 色阁综合伊人av| www..com.cn蕾丝视频在线观看免费版| 国产精品对白| 91精品国产高清一区二区三区| 欧美日韩一区二区三区69堂| av高清一区| 日本乱码高清不卡字幕| 久久久久久久久久福利| 亚洲永久av| 色播五月激情综合网| 国产亚洲欧美在线视频| 黄色在线网站噜噜噜| 性做久久久久久免费观看欧美| 黄色一级片国产| 欧美人与禽猛交乱配| 亚洲一区二区黄色| 男人天堂手机在线视频| 国产精品—色呦呦| 亚洲综合在线观看视频| 日韩一级片免费视频| heyzo高清在线| 亚洲男人的天堂网| 国产精品久久久影院| 天天色天天射天天综合网| 亚洲精品国产a久久久久久| 国产av第一区| ririsao久久精品一区| 亚洲国产精品久久人人爱| 日韩精品一区在线视频| 成人免费图片免费观看| 精品女同一区二区三区在线播放| 国产人妻777人伦精品hd| 欧美另类老肥妇| 在线亚洲一区二区| 国产色视频在线播放| 国产精品毛片无码| 欧美videos大乳护士334| 久久性爱视频网站| 亚洲人成网77777色在线播放| 亚洲色图av在线| 国产大屁股喷水视频在线观看| 91精品国产自产拍在线观看蜜| 欧美福利视频在线观看| 久热这里只有精品6| 青草国产精品久久久久久| 成人中文字幕在线观看| 黄色一级a毛片| 久久久精品tv| 欧美a级免费视频| 一区二区电影免费观看| 欧美日韩免费高清一区色橹橹 | 偷窥自拍亚洲色图精选| 中文字幕少妇一区二区三区| 中文字幕影音先锋| 母乳一区在线观看| 亚洲最大成人免费视频| 免费黄色片在线观看| 亚洲欧美自拍偷拍| 国产成人无码精品久久久性色| 台湾成人免费视频| 欧美精品一区二| 亚洲v国产v欧美v久久久久久| 亚洲国产成人精品女人| 欧美在线视频免费播放| 99在线观看精品视频| 久久中文娱乐网| 日韩精品久久一区二区| 午夜精品成人av| 亚洲精品一区二区在线观看| www中文在线| 亚洲欧美激情诱惑| 国产精品久久精品国产| 亚洲图片88| 91国产成人在线| 超碰97在线资源站| 欧美日韩精品免费观看视频完整| 国产精品第一第二| 视频一区二区三区国产| 亚洲夂夂婷婷色拍ww47| 欧美成人黄色网址| 香蕉视频一区| 午夜剧场成人观在线视频免费观看| 一区精品在线观看| 久久久久久久综合狠狠综合| 久无码久无码av无码| 国产精品一区三区在线观看| 一区二区欧美日韩视频| 国产在线观看黄色| av电影在线观看完整版一区二区| 久久久无码中文字幕久...| 99re久久| 在线精品播放av| 无码人妻丰满熟妇精品| 成人黄色在线看| 国产在线xxxx| 玖玖玖电影综合影院| 色婷婷久久av| 97caocao| 亚洲欧洲无码一区二区三区| 亚洲欧美在线精品| 欧美日一区二区| 国产精品扒开腿爽爽爽视频| 久久精品国产亚洲a∨麻豆| 欧美日韩在线影院| www.超碰97| 亚洲欧美成人综合| 日本不卡二区高清三区| 向日葵视频成人app网址| 亚洲欧美一区二区三区久久| 丰满人妻老熟妇伦人精品| 91视频免费看| 欧美精品第三页| 欧美军人男男激情gay| 国产91免费观看| 福利在线观看| 欧美日韩国产小视频| 少妇视频一区二区| 国产乱码精品一区二区三区忘忧草| 亚洲综合首页| 亚洲不卡在线| 午夜精品久久久久久久99黑人| 欧洲精品久久一区二区| 精品毛片三在线观看| 四虎影成人精品a片| 日本aⅴ免费视频一区二区三区 | 极品白嫩丰满美女无套| 久久精品动漫| 亚洲v国产v在线观看| 视频欧美精品| 欧美高清视频免费观看| 少妇又色又爽又黄的视频| 欧美网站在线观看| 美国美女黄色片| 国产乱人伦偷精品视频不卡| 国产一线二线三线女| 牲欧美videos精品| 国产精品永久免费视频| av片在线观看网站| 日韩精品在线第一页| 久久久久亚洲视频| 亚洲视频免费在线观看| 99精品一区二区三区无码吞精 | 国产农村妇女毛片精品久久麻豆 | 男人操女人逼免费视频| 日本道不卡免费一区| 5566中文字幕一区二区| 午夜影院在线播放| 正在播放欧美视频| 欧美一区二区黄片| 欧美曰成人黄网| 久久久久久久久久久久久久免费看 | 成人羞羞网站| www日韩av| 99riav视频一区二区| 久久久久久久一| 91在线视频| 日韩av网站导航| ,一级淫片a看免费| 欧美日韩国产一区在线| 天堂网中文在线观看| 不卡一区在线观看| 91丨九色丨蝌蚪| 亚洲欧美日韩国产一区| www.-级毛片线天内射视视| 中文字幕精品影院| 岛国视频一区| 福利一区和二区| 国产91精品久久久久久| www视频在线免费观看| 精品视频偷偷看在线观看| 国产精品主播一区二区| 91精品91久久久中77777| 国产亚洲精品码| 亚洲欧洲一区二区在线播放| 午夜精产品一区二区在线观看的| 国产大片一区二区| 欧美日韩精品区别| 视频在线观看国产精品| 国产 日韩 亚洲 欧美| 欧美精品不卡| 一本—道久久a久久精品蜜桃| 精品精品99| 欧美h视频在线| 久久久精品国产**网站| 91香蕉视频在线下载| 中文幕av一区二区三区佐山爱| 欧美做受高潮1| av影院在线免费观看| 欧美精品免费在线观看| 看女生喷水的网站在线观看| 在线观看国产欧美| 国产大片在线免费观看| 亚洲欧美三级在线| 欧洲一区av| 日韩高清欧美高清| 午夜性色福利影院| 精品国产乱码久久久久久牛牛| 国产又大又长又粗| 欧美精品v国产精品v日韩精品| 国产裸体美女永久免费无遮挡| 91国内精品野花午夜精品| 亚洲 欧美 中文字幕| 欧美午夜精品在线| av大全在线观看| 色综合色综合色综合| 九九精品免费视频| 欧美性猛交丰臀xxxxx网站| 久久青青草视频| 欧美视频裸体精品| 无码一区二区三区在线观看| 在线观看亚洲精品视频| 最近中文字幕在线观看| 欧美日韩高清一区| 国产有码在线观看| 日韩网站在线看片你懂的| 国产av无码专区亚洲av| 精品国产一二三区| 日本xxxxwww| 亚洲人成电影网站色www| 国产资源在线看| 中文字幕欧美日韩精品| 好操啊在线观看免费视频| 久久久av免费| 国产羞羞视频在线播放| 欧美一区深夜视频| 韩日精品一区| 亚洲自拍偷拍区| 精品三级在线观看视频| 欧美日韩国产综合视频在线| 不卡在线一区二区| 中国一区二区三区| 黄色成人精品网站| 两根大肉大捧一进一出好爽视频| 爽好多水快深点欧美视频| 中文字幕 欧美日韩| 高清国产一区二区三区| 激情综合丁香五月| 国产精品美女久久久久av爽李琼 | jizz视频在线观看| 久久精品国产成人| 国产精品蜜芽在线观看| 国产精品jizz在线观看麻豆| 亚洲人成777| 精品不卡一区二区三区| 国产调教一区二区三区| 玖玖精品在线视频| 久久久久久色| 亚洲国产精品第一页| 久久夜色精品国产噜噜av| 亚洲天堂一级片| 黑人巨大精品欧美一区二区三区 | 免费观看国产视频在线| 在线视频精品| 超碰91在线播放| 久久亚洲一级片| 欧美一区二区三区爽爽爽| 色婷婷久久久久swag精品| 国内精品国产成人国产三级| 亚洲男人天天操| 欧美xxxx性xxxxx高清| 国产精品久久久久久久电影| 国产乱人伦丫前精品视频| 亚洲一区影院| 蜜乳av另类精品一区二区| 制服下的诱惑暮生| 欧美激情一区二区三区| 国产在线拍揄自揄拍无码视频| 欧美日韩国产在线观看| 欧洲一级在线观看| 色综合天天狠天天透天天伊人 | 欧美夫妻性生活| 国模吧精品人体gogo| 午夜精品久久久久久99热软件| 99久久久成人国产精品| 视频二区一区| 亚洲一区日韩| 深夜视频在线观看| 中文字幕亚洲精品在线观看| 中文字幕在线观看视频免费| 亚洲激情成人网| 国产精品69xx| 99久久国产免费免费| 欧美xxxxx视频| 一级在线免费视频| 久久日韩精品一区二区五区| 国产精品成人aaaa在线| 精品久久久久一区| 51xtv成人影院| 亚洲一区二区久久久久久久| 99热精品久久| 91女神在线观看| 国产欧美视频一区二区| 久久精品无码av| 亚洲欧美日韩国产精品| 色在线中文字幕| 久久精品一二三区| 亚洲综合另类| 免费的av网站| 欧美日韩国产页| 日本午夜在线视频| 欧美中文字幕在线播放| 丝袜美腿一区二区三区动态图| 欧美在线一区视频| heyzo一本久久综合| 国产精品第9页| 日韩成人在线电影网| 在线日韩影院| 日本在线观看一区二区三区| 日本最新不卡在线| 青青青视频在线免费观看| 欧美精品少妇一区二区三区| 麻豆网站视频在线观看| 亚洲精品免费一区二区三区| 欧美黄色大片网站| 91传媒理伦片在线观看| 岛国av一区二区| 国产youjizz在线| 成人av资源在线播放| 欧美黄免费看| 国产精品无码在线| 日韩欧美有码在线| 永久免费在线观看视频| 亚洲最大成人在线| 99精品久久| 免费看黄色三级| 在线综合+亚洲+欧美中文字幕| 色屁屁www国产馆在线观看| 国产精品免费一区二区三区观看| 99re国产精品| 亚洲一二三四视频| 欧美一区二区成人6969| 国内精彩免费自拍视频在线观看网址| 欧美久久在线| 激情六月婷婷久久| 国产精品99精品无码视| 亚洲视频axxx| 精品午夜视频| 欧美 日本 亚洲| 国产精品美女久久久久久久| 性色av蜜臀av| 日本久久中文字幕| 亚洲成人国产| 波多野结衣办公室33分钟| 欧美日本在线播放| av资源中文在线| 亚洲欧美日产图| 成人爱爱电影网址| 最近国语视频在线观看免费播放| 欧美日韩国产va另类| 免费欧美视频| 欧美xxxx日本和非洲| 欧美性xxxxx极品少妇| 欧美aaaaaaa| 深夜福利成人| 97国产精品videossex| 91久久国语露脸精品国产高跟| 午夜精品视频网站| 亚洲精品网址| 欧美另类z0zx974| 亚洲第一精品自拍| 亚洲视频资源|