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

JavaScript 中的 this 全面解析

開發(fā) 前端
如果要判斷一個運(yùn)行中的函數(shù)的this綁定,就需要找到這個函數(shù)的直接調(diào)用位置。找到之后就可以順序應(yīng)用下面這四條規(guī)則來判斷this的綁定對象。

[[192022]]

隱式綁定

關(guān)于this,一般來說,誰調(diào)用了方法,該方法的this就指向誰,如:

  1. function foo(){ 
  2.     console.log(this.a) 
  3.  
  4. var a = 3; 
  5.  
  6. var obj = { 
  7.     a: 2, 
  8.     foo: foo 
  9. }; 
  10.  
  11. obj.foo(); // 輸出2,因?yàn)槭莖bj調(diào)用的foo,所以foo的this指向了obj,而obj.a = 2 

如果存在多次調(diào)用,對象屬性引用鏈只有上一層或者說***一層在調(diào)用位置中起作用,如:

  1. function foo() { 
  2.     console.log( this.a ) 
  3.  
  4. var obj2 = {  
  5.     a: 42, 
  6.     foo: foo 
  7.  
  8. var obj1 = { 
  9.     a: 2, 
  10.     obj2: obj2 
  11.  
  12. obj1.obj2.foo(); // 42 

隱式丟失

一個最常見的this綁定問題就是被隱式綁定的函數(shù)會丟失綁定對象,也就是說他回應(yīng)用默認(rèn)綁定,從而把this綁定到全局對象或者undefined上,取決于是否是嚴(yán)格模式。

  1. function foo() { 
  2.     console.log( this.a ) 
  3.  
  4. var obj1 = { 
  5.     a: 2, 
  6.     foo: foo 
  7.  
  8. var bar = obj1.foo; // 函數(shù)別名! 
  9.  
  10. var a = "oops, global"; // a是全局對象的屬性 
  11.  
  12. bar(); // "oops, global" 

雖然bar是obj.foo的一個引用,但是實(shí)際上,它引用的是foo函數(shù)本身,因此此時的bar()其實(shí)是一個不帶任何修飾的函數(shù)調(diào)用,因此應(yīng)用了默認(rèn)綁定

一個更微妙、更常見并且更出乎意料的情況發(fā)生在傳入回調(diào)函數(shù)時:

  1. function foo() { 
  2.     console.log( this.a ) 
  3.  
  4. function doFoo( fn ){ 
  5.     // fn 其實(shí)引用的是 foo 
  6.     fn(); // <-- 調(diào)用位置! 
  7.  
  8. var obj = { 
  9.     a: 2, 
  10.     foo: foo 
  11.  
  12. var a = "oops, global"; // a是全局對象的屬性 
  13.  
  14. doFoo( obj.foo ); // "oops, global" 

參數(shù)傳遞其實(shí)就是一種隱式賦值,因此我們傳入函數(shù)時也會被隱式賦值,所以結(jié)果和上一個例子一樣,如果把函數(shù)傳入語言內(nèi)置的函數(shù)而不是傳入自己聲明的函數(shù)(如setTimeout等),結(jié)果也是一樣的

顯式綁定

簡單的說,就是指定this,如:call、apply、bind、new綁定等

硬綁定

  1. function foo( something ) { 
  2.     console.log( this.a, something) 
  3.     return this.a + something 
  4.  
  5. var obj = { 
  6.     a: 2 
  7.  
  8. var bar = function() { 
  9.     return foo.apply( obj, arguments) 
  10.  
  11. var b = bar(3); // 2 3 
  12. console.log(b); // 5 

這里簡單做一下解釋: 在bar函數(shù)中,foo使用apply函數(shù)綁定了obj,也就是說foo中的this將指向obj,與此同時,使用arguments(不限制傳入?yún)?shù)的數(shù)量)作為參數(shù)傳入foo函數(shù)中;所以在運(yùn)行bar(3)的時候,首先輸出obj.a也就是2和傳入的3,然后foo返回了兩者的相加值,所以b的值為5

同樣,本例也可以使用bind:

  1. function foo( something ) { 
  2.     console.log( this.a, something) 
  3.     return this.a + something 
  4.  
  5. var obj = { 
  6.     a: 2 
  7.  
  8. var bar = foo.bind(obj) 
  9.  
  10. var b = bar(3); // 2 3 
  11. console.log(b); // 5 

new綁定

在傳統(tǒng)面向類的語言中,使用new初始化類的時候會調(diào)用類中的構(gòu)造函數(shù),但是JS中new的機(jī)制實(shí)際上和面向類和語言完全不同。

使用new來調(diào)用函數(shù),或者說發(fā)生構(gòu)造函數(shù)調(diào)用時,會自動執(zhí)行下面的操作:

  • 創(chuàng)建(或者說構(gòu)造)一個全新的對象
  • 這個新對象會被執(zhí)行[[Prototype]]連接
  • 這個新對象會綁定到函數(shù)調(diào)用的this
  • 如果函數(shù)沒有返回其他對象,那么new表達(dá)式中的函數(shù)會自動返回這個新對象 如:
  1. function foo(a){ 
  2.     this.a = a 
  3.  
  4. var bar = new foo(2); 
  5. console.log(bar.a); // 2 

使用new來調(diào)用foo(…)時,我們會構(gòu)造一個新對象并把它綁定到foo(…)調(diào)用中的this上。new是***一種可以影響函數(shù)調(diào)用時this綁定行為的方法,我們稱之為new綁定。

this的優(yōu)先級

毫無疑問,默認(rèn)綁定的優(yōu)先級是四條規(guī)則中***的,所以我們可以先不考慮它。

隱式綁定和顯式綁定哪個優(yōu)先級更高?我們來測試一下:

  1. function foo(a){ 
  2.     console.log(this.a) 
  3.  
  4. var obj1 = { 
  5.     a: 2, 
  6.     foo: foo 
  7.  
  8. var obj2 = { 
  9.     a: 3, 
  10.     foo: foo 
  11.  
  12. obj1.foo(); // 2 
  13. obj2.foo(); // 3 
  14.  
  15. obj1.foo.call(obj2); // 3 
  16. obj2.foo.call(obj1); // 2 

可以看到,顯式綁定優(yōu)先級更高,也就是說在判斷時應(yīng)當(dāng)先考慮是否可以存在顯式綁定。

現(xiàn)在我們要搞清楚new綁定和隱式綁定的優(yōu)先級誰高誰低 :

  1. function foo(something){ 
  2.     this.a = something 
  3.  
  4. var obj1 = { 
  5.     foo: foo 
  6.  
  7. var obj2 = {} 
  8.  
  9. obj1.foo(2);  
  10. console.log(obj1.a); // 2 
  11.  
  12. obj1.foo.call(obj2,3); 
  13. console.log(obj2.a); // 3 
  14.  
  15. var bar = new obj1.foo(4) 
  16. console.log(obj1.a); // 2 
  17. console.log(bar.a); // 4 

可以看到new綁定比隱式綁定優(yōu)先級高。但是new綁定和顯式綁定誰的優(yōu)先級更高呢?

  1. function foo(something){ 
  2.     this.a = something 
  3.  
  4. var obj1 = {} 
  5.  
  6. var bar = foo.bind(obj1); 
  7. bar(2); 
  8. console.log(obj1.a); // 2 
  9.  
  10. var baz = new bar(3); 
  11. console.log(obj1.a); // 2 
  12. console.log(baz.a); // 3 

可以看到,new綁定修改了硬綁定中的this,所以new綁定的優(yōu)先級比顯式綁定更高。

之所以要在new中使用硬綁定函數(shù),主要目的是預(yù)先設(shè)置函數(shù)的一些參數(shù),這樣在使用new進(jìn)行初始化時就可以只傳入其余的參數(shù)。bind(…)的功能之一就是可以把除了***個參數(shù)(***個參數(shù)用于綁定this)之外的其他參數(shù)都傳給下層的函數(shù)(這種技術(shù)稱為“部分應(yīng)用”,是“柯里化”的一種)。舉例來說:

  1. function foo(p1,p2){ 
  2.     this.val = p1 + p2; 
  3.  
  4. // 之所以使用null是因?yàn)樵诒纠形覀儾⒉魂P(guān)心硬綁定的this是什么 
  5. // 反正使用new時this會被修改 
  6. var bar = foo.bind(null,'p1'); 
  7.  
  8. var baz = new bar('p2'); 
  9.  
  10. baz.val; // p1p2 

柯里化:在直覺上,柯里化聲稱“如果你固定某些參數(shù),你將得到接受余下參數(shù)的一個函數(shù)”。所以對于有兩個變量的函數(shù)yx,如果固定了 y = 2,則得到有一個變量的函數(shù) 2x

This在箭頭函數(shù)中的應(yīng)用

箭頭函數(shù)不使用this的四種標(biāo)準(zhǔn)規(guī)則,而是根據(jù)外層(函數(shù)或者全局)作用域來決定this。

我們來看一下箭頭函數(shù)的詞法作用域:

  1. function foo() { 
  2.     // 返回一個箭頭函數(shù) 
  3.     return (a) => { 
  4.         // this繼承自foo() 
  5.         console.log(this.a) 
  6.     }; 
  7.  
  8. var obj1 = { 
  9.     a: 2 
  10. }; 
  11.  
  12. var obj2 = { 
  13.     a: 3 
  14. }; 
  15.  
  16. var bar = foo.call(obj1); 
  17. bar.call(obj2); // 2, 不是3! 

foo()內(nèi)部創(chuàng)建的箭頭函數(shù)會捕獲調(diào)用時foo()的this。由于foo()的this綁定到obj1,bar(引用箭頭函數(shù))的this也會綁定到obj1,箭頭函數(shù)的綁定無法被修改。(new也不行!)

總結(jié)

如果要判斷一個運(yùn)行中的函數(shù)的this綁定,就需要找到這個函數(shù)的直接調(diào)用位置。找到之后就可以順序應(yīng)用下面這四條規(guī)則來判斷this的綁定對象。

由new調(diào)用?綁定到新創(chuàng)建的對象。

由call或者apply(或者bind)調(diào)用?綁定到指定的對象。

由上下文對象調(diào)用?綁定到那個上下文對象。

默認(rèn):在嚴(yán)格模式下綁定到undefined,否則綁定到全局對象。

責(zé)任編輯:武曉燕 來源: 碼農(nóng)網(wǎng)
相關(guān)推薦

2024-04-01 04:00:00

JavaScript前端開發(fā)

2010-06-11 14:46:09

UML模型

2024-06-14 09:53:02

2021-11-23 09:09:27

Applicationandroid系統(tǒng)開發(fā)

2021-11-19 17:26:11

AppApplication方法

2025-06-27 07:19:48

2017-04-10 18:34:16

AndroidNotificatio

2009-10-14 08:47:53

綜合布線系統(tǒng)測試

2024-08-29 08:28:17

2011-03-25 09:37:17

2010-10-08 12:46:27

Javascriptreplace()

2010-06-24 15:35:04

IPx協(xié)議

2010-03-09 17:19:01

Linux時鐘

2010-07-22 09:25:09

telnet命令

2009-12-24 14:02:57

Linux集群技術(shù)

2025-02-13 07:49:49

2016-10-12 11:08:16

JavaScriptarguments數(shù)組

2011-04-12 15:00:48

Oracle碎片

2010-01-06 17:12:57

Linux主要構(gòu)成

2010-06-28 18:52:49

UML關(guān)系符號
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

中文字幕+乱码+中文乱码www| 97不卡在线视频| 精品一二三四五区| 好吊色一区二区三区| 久久裸体网站| 欧美日韩一级视频| 老司机午夜网站| 性一交一乱一色一视频麻豆| 尹人成人综合网| 精品视频久久久久久| 老太脱裤让老头玩ⅹxxxx| 亚洲欧美激情国产综合久久久| 天天做天天爱天天综合网| 欧美一级片在线观看| 日韩在线视频在线| 香蕉久久国产av一区二区| 国产精品最新自拍| 丝袜亚洲另类欧美重口| 又色又爽又黄18网站| 欧产日产国产精品视频| 欧美激情一区二区三区| 国产一区二区在线观| 精品无码在线视频| 国产裸体美女永久免费无遮挡| 欧美手机视频| 日韩一级大片在线观看| 久久手机在线视频| 天堂v视频永久在线播放| 成人爽a毛片一区二区| 亚洲日本激情| 中文字幕日韩欧美精品在线观看| 国产精品jizz在线观看老狼| 老熟妇高潮一区二区高清视频| 久久久蜜桃一区二区人| 欧美成人中文字幕| 久久精品国产亚洲av久| 久久久久久久久久久久电影| 色先锋资源久久综合| 午夜精品一区二区在线观看的 | 国产a级片免费看| 黄色美女一级片| 国内精品视频666| 国产91精品高潮白浆喷水| 亚洲熟女毛茸茸| 妖精视频一区二区三区免费观看| 欧美日韩精品免费| av免费观看网| 久久99亚洲网美利坚合众国| 国产欧美精品一区二区色综合| 国产精品一区二区三区在线| 精品人妻一区二区三区麻豆91| 狠狠综合久久| 九九九久久久久久| 国产白丝一区二区三区 | 99久久国产综合精品成人影院| 精品嫩草影院久久| 婷婷中文字幕在线观看| 国产精品videossex撒尿| 欧美视频精品一区| 浴室偷拍美女洗澡456在线| 精品一二三区视频| 成人免费观看av| 成人欧美一区二区三区在线观看| 亚洲精品国产精| 成人av综合在线| 美国av一区二区三区| 五月天激情婷婷| 久久久久一区二区三区四区| 日韩欧美在线电影| 亚洲xxxxxx| 亚洲色图都市小说| 久草视频这里只有精品| 国产美女高潮在线| 婷婷成人综合网| 男人日女人视频网站| 青青青草视频在线| 欧美日韩国产激情| 一区二区三区 日韩| 精品国产乱码一区二区三区| 亚洲精品在线三区| 婷婷五月精品中文字幕| 亚洲69av| 久久精品美女视频网站| 欧美性x x x| 日韩视频二区| 国产日韩综合一区二区性色av| 中文字幕乱码在线观看| 国产河南妇女毛片精品久久久| 3d蒂法精品啪啪一区二区免费| 国产精品高潮呻吟AV无码| 国产精品一区二区三区四区| 国产日韩欧美精品| 无码国产精品一区二区免费16| 欧美激情综合五月色丁香小说| 综合久久国产| 欧美大胆的人体xxxx| 91九色02白丝porn| 四虎1515hh.com| 久久99久久人婷婷精品综合| 久久综合亚洲社区| 亚洲天堂一区在线| 国产酒店精品激情| 欧美日产一区二区三区在线观看| www免费在线观看| 亚洲国产精品天堂| 十八禁视频网站在线观看| 视频二区欧美| 中文字幕日韩视频| 在线能看的av| 国产成人99久久亚洲综合精品| 日韩成人av网站| 国产第一页在线| 欧美日本一道本| 国产xxxx视频| 亚洲国产精品综合久久久| 欧美诱惑福利视频| www.97av| 亚洲国产精品成人久久综合一区| 欧美一级视频免费看| 成人在线啊v| 亚洲人成电影网站色www| 久久丫精品久久丫| 日韩精品一级二级| 国产精品成人一区二区三区| 国产在线自天天| 欧美日韩加勒比精品一区| 色男人天堂av| 五月天激情综合网| 国产精品久久久久久久久久免费 | 免费中文字幕在线观看| 日产国产欧美视频一区精品| 久久99导航| 激情图片在线观看高清国产| 欧美一区二区视频网站| 好吊视频在线观看| 奶水喷射视频一区| 精品国产免费人成电影在线观... 精品国产免费久久久久久尖叫 | 亚洲国产精品影视| 欧美性理论片在线观看片免费| 亚洲精品99久久久久| www.99re7.com| 国产原创一区二区| 特色特色大片在线| 久久久久久一区二区三区四区别墅| 亚洲人成在线一二| 一级片视频在线观看| 国产成人99久久亚洲综合精品| 日本a级片在线观看| 国产美女精品视频免费播放软件| 久久精品精品电影网| 91成人在线免费| 中文字幕中文字幕一区二区| 国模私拍视频在线观看| 激情综合网站| 国产欧美一区二区三区在线| 自拍视频在线播放| 国产精品主播直播| 四虎一区二区| 成人四虎影院| 久久亚洲精品网站| 午夜精品久久久久久久99老熟妇| 亚洲精品免费电影| 91视频福利网| 亚洲精品一二三区区别| 91在线视频精品| 女囚岛在线观看| 日韩欧美高清一区| 国产精品7777777| 久久久一区二区三区捆绑**| 九九九在线观看视频| 日韩精品免费| 日韩免费观看高清| 伦xxxx在线| 亚洲福利视频网| 亚洲精品91天天久久人人| 综合分类小说区另类春色亚洲小说欧美| 在线看的黄色网址| 国产字幕视频一区二区| 就去色蜜桃综合| 亚州精品国产| 97人洗澡人人免费公开视频碰碰碰| 全部毛片永久免费看| www久久精品| 亚洲精品在线视频播放| 黄色日韩在线| 成人免费视频网站| 亚洲www.| 久久成人亚洲精品| 三级在线电影| 911精品产国品一二三产区| 日本一二三不卡视频| 国产乱码一区二区三区| 日韩精品一区二区三区色欲av| 91亚洲国产成人久久精品| 国产伦精品一区二区三区| 国产精品高潮久久| 性欧美xxxx视频在线观看| 成人免费在线电影| 亚洲电影在线看| 中文字幕免费播放| 五月综合激情网| 潘金莲一级黄色片| 久久新电视剧免费观看| 国产又黄又猛又粗又爽的视频| 韩国自拍一区| 狼狼综合久久久久综合网| 色播一区二区| 国产精品白嫩初高中害羞小美女 | 庆余年2免费日韩剧观看大牛| 国产二区在线播放| 亚洲激情视频在线| 国产三级漂亮女教师| 91福利精品视频| www.中文字幕在线观看| 亚洲男人电影天堂| 亚洲天堂久久新| 成人v精品蜜桃久久一区| 国产美女视频免费看| 可以免费看不卡的av网站| 国产av第一区| 欧美电影《睫毛膏》| 欧美日韩大片一区二区三区 | 麻豆一区二区99久久久久| 日本在线xxx| 欧美在线三级| 中文字幕成人一区| 日本黄色精品| 色999五月色| 国产一区2区| 久久综合一区| 天堂日韩电影| 久久99影院| 婷婷精品在线| 精品一区久久久久久| 999久久精品| 国产精品电影网| 精品123区| 国产精品久久久久久久美男| 电影亚洲精品噜噜在线观看| 45www国产精品网站| yellow字幕网在线| 久久久久久中文字幕| 毛片在线播放a| 久久九九国产精品怡红院| 欧美成人高清在线| 日韩在线观看免费| 免费黄色网页在线观看| 俺去亚洲欧洲欧美日韩| 成人在线免费视频| 中文字幕在线精品| 麻豆电影在线播放| 国产亚洲免费的视频看| 国产一二三区在线视频| 亚洲精品视频在线观看视频| 天天干天天草天天射| 国产丝袜一区视频在线观看| 99久久精品日本一区二区免费| 欧美一区二区三区播放老司机| 欧美特级黄色片| 欧美午夜精品久久久久久孕妇 | 日韩欧美www| 亚洲乱色熟女一区二区三区| 日韩欧美在线一区二区三区| 亚洲欧美另类综合| 日韩黄色av网站| 国产专区在线播放| 久久亚洲国产精品| www在线看| 欧美主播福利视频| 日韩欧美另类一区二区| 国产精品旅馆在线| vam成人资源在线观看| dy888夜精品国产专区| 激情小说一区| 日本视频精品一区| 亚洲精品久久久| 三上悠亚久久精品| 日本少妇一区二区| 91人妻一区二区三区| zzijzzij亚洲日本少妇熟睡| 9.1成人看片| 国产日韩av一区二区| 成人黄色短视频| 亚洲免费在线播放| 日韩色图在线观看| 在线不卡a资源高清| 亚洲国产成人一区二区| 欧美成人aa大片| 国产精品一二三区视频| 欧美成人黑人xx视频免费观看| 日韩电影免费看| 成人午夜在线观看| 亚洲人成亚洲精品| 国产日韩第一页| 久久亚洲欧洲| 99中文字幕在线| 国产亚洲综合性久久久影院| 中文字幕在线2021| 日本久久一区二区| 韩国av在线免费观看| 色偷偷噜噜噜亚洲男人| 不卡av免费观看| 国产精品久久久久久av| 国产精品对白久久久久粗| 69影院欧美专区视频| 久久青草免费| 精品欧美日韩| 不卡在线一区| 国产精品69久久久| 久久99日本精品| 男女黄床上色视频| 亚洲综合男人的天堂| 亚洲一级特黄毛片| 精品国产乱码久久久久久久久| 99精品老司机免费视频| 2019日本中文字幕| 综合伊人久久| 妞干网这里只有精品| 美女mm1313爽爽久久久蜜臀| 成人影视免费观看| 中文字幕综合网| 国产无遮挡又黄又爽又色视频| 精品88久久久久88久久久| 在线观看操人| 亚洲一区美女视频在线观看免费| 残酷重口调教一区二区| 欧美综合在线观看视频| 99视频精品在线| 伊人国产在线观看| 欧美sm极限捆绑bd| 黄页视频在线播放| 国产欧洲精品视频| 成人免费a**址| 真人抽搐一进一出视频| 国产a视频精品免费观看| 卡通动漫亚洲综合| 欧美精品久久一区| 欧美性猛交xxx乱大交3蜜桃| 日本精品中文字幕| 久久不见久久见中文字幕免费| 中国丰满人妻videoshd| 99精品视频在线免费观看| 国产精品19乱码一区二区三区| 欧美一级国产精品| av在线下载| 99在线视频免费观看| 国产精品v一区二区三区| 91网址在线观看精品| 国产精品国产三级国产aⅴ中文 | 日韩av中文字幕在线| 成人影音在线| 99超碰麻豆| 狠狠爱综合网| 亚洲欧美视频在线播放| 欧美日韩中文在线| 欧美xxx.com| 国产精品视频久久| 性xxxx欧美老肥妇牲乱| 亚洲欧美激情一区二区三区| 亚洲精品自拍动漫在线| 国产精品探花视频| 欧美激情国内偷拍| 日韩大胆成人| 看欧美ab黄色大片视频免费| 国产精品视频观看| 艳妇乳肉豪妇荡乳av无码福利 | 蜜桃视频在线观看免费视频| 欧美大陆一区二区| 另类综合日韩欧美亚洲| 久久国产波多野结衣| 亚洲精品在线观| 日韩免费福利视频| 中文字幕在线乱| 99久久国产综合精品色伊| 国产成人无码一区二区在线播放| 亚洲小视频在线| 男女啪啪999亚洲精品| 一区二区在线观| 国产乱一区二区| 五月天婷婷激情| 久久国产精品久久久久久| 日本欧美韩国国产| 性生活免费在线观看| 亚洲自拍偷拍网站| 天天av综合网| 成人福利在线视频| 99精品久久| 亚洲男人在线天堂| 欧美日韩久久久久久| 国产深夜视频在线观看| 国产一区二区在线观看免费播放| 久久一区国产| 欧美黑人一级片| 亚洲精品一区二区久| 亚洲我射av| 日韩少妇内射免费播放| 亚洲三级电影全部在线观看高清| www.国产免费| 国产精品激情av电影在线观看| 欧美手机视频|