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

捆绑调教一区二区三区| 国产精选久久久久久| 日韩精品――色哟哟| 黄色在线看片| 99re这里只有精品首页| 国产成人精品在线观看| 黄色香蕉视频在线观看| xxxx日韩| 色先锋aa成人| 99久久久无码国产精品性色戒| 亚洲乱色熟女一区二区三区| 国产午夜久久| 色婷婷久久一区二区| 亚洲欧美日韩中文字幕在线观看| 色噜噜狠狠狠综合欧洲色8| 26uuu国产日韩综合| 国产欧美日韩综合精品| 国产亚洲欧美精品久久久久久| 久久最新网址| 日韩三级电影网址| 久久久久久久片| 欧美草逼视频| 中文字幕av不卡| 成人性色av| 中文字幕一区二区久久人妻| 亚洲国产日本| 久久久国产影院| 欧美熟妇一区二区| 无码国模国产在线观看| 在线一区二区三区做爰视频网站| www.国产在线视频| 最新电影电视剧在线观看免费观看| 成人一区二区三区视频在线观看| 国产精品视频xxx| 免费在线不卡视频| 欧美久久一级| 久久精品国产69国产精品亚洲 | 国产高清不卡av| 五月婷婷丁香在线| 国产一区二区三区久久| 色综合久久悠悠| 九九热视频在线免费观看| 久久不见久久见免费视频7| 亚洲精品二三区| 欧美图片自拍偷拍| 精品国产伦一区二区三区观看说明| 91国在线观看| 农村妇女精品一二区| 成人三级小说| 亚洲一二三四区不卡| 少妇熟女一区二区| 在线免费看av| 国产精品色在线观看| 欧洲国产精品| 免费av在线电影| av在线播放不卡| 国产一区二区在线观看免费播放| 国产成人久久精品77777综合| 久久9热精品视频| 国产精品视频导航| 中文字幕在线观看欧美| 久久丁香综合五月国产三级网站| 国产剧情久久久久久| 中文字幕一区二区三区人妻四季| 日一区二区三区| 国产成人免费91av在线| 国产一区二区视频免费| 日本中文在线一区| 国产精品美乳在线观看| 精品一区二三区| 蜜臀av一区二区在线免费观看| 国产精品美女久久久免费| 中文字幕+乱码+中文字幕明步| 日本中文一区二区三区| 国产在线日韩在线| 超碰福利在线观看| 99久久婷婷国产| 久久久人人爽| 国产午夜精品一区理论片| 国产欧美日韩亚州综合| 在线播放豆国产99亚洲| 国产写真视频在线观看| 亚洲一区二区视频| 97国产在线播放| 性高爱久久久久久久久| 欧美日韩精品欧美日韩精品| 日本中文字幕在线不卡| 精品按摩偷拍| 亚洲性猛交xxxxwww| 久久99久久99精品免费看小说| 亚洲精品成人| 国外色69视频在线观看| 无码人妻丰满熟妇奶水区码| 老**午夜毛片一区二区三区 | xxxx 国产| 性8sex亚洲区入口| 国产日韩精品电影| 欧美特黄一级视频| 欧美激情在线观看视频免费| 影音先锋成人资源网站| 五月天av在线| 91精品国产综合久久久久久久久久| 国产乱淫av麻豆国产免费| 久久99国内| 欧美插天视频在线播放| 国产一级18片视频| 国产在线一区二区| 麻豆av福利av久久av| 国产在线激情| 色天天综合色天天久久| 色哟哟在线观看视频| 一区二区三区视频免费观看| 另类色图亚洲色图| 黄色免费av网站| 国产在线不卡一区| 日本一区免费观看| 超碰97国产精品人人cao| 欧美色综合网站| 精品国产av色一区二区深夜久久 | 日本一区二区免费高清视频| 国产一二三在线| 欧美精品亚洲一区二区在线播放| 精品人妻一区二区三区视频| 天天做天天爱天天综合网| 欧美中文字幕在线| 亚洲精品成av人片天堂无码 | 鲁鲁狠狠狠7777一区二区| 国产精品久久久久久福利| 色哟哟一区二区在线观看| 亚洲精品鲁一鲁一区二区三区 | 亚洲欧美综合另类中字| 久久免费视频播放| 国产尤物一区二区| 亚洲精品日韩精品| 久久久成人av毛片免费观看| 日韩精品免费在线观看| 久草视频免费播放| 国产一区二区三区国产| 天堂一区二区三区| 欧美片第1页| 日韩精品视频在线免费观看| 国产性70yerg老太| 国产成人av一区二区三区在线 | 五月天亚洲婷婷| 91精品国产三级| 日韩一区欧美| 国产精品久久久久av| 三级在线播放| 黑人巨大精品欧美一区二区三区 | 国产一区二区三区在线看| 日韩男人的天堂| 成人在线视频一区二区| 国产av熟女一区二区三区| 视频在线观看免费影院欧美meiju| 精品久久国产精品| 国产精品视频a| 日韩一区在线免费观看| 国产精品中文久久久久久| 夜间精品视频| 91免费在线观看网站| av网址在线| 欧美一区二区三区视频免费播放| 中文字幕在线2021| 国产白丝网站精品污在线入口| 久久手机在线视频| 国产精品香蕉| **欧美日韩vr在线| 欧美理论在线观看| 欧美日韩一区二区三区四区| 欧美日韩国产一二三区| 精品亚洲免费视频| 成人国产一区二区三区| www国产精品| 奇米4444一区二区三区 | 99这里都是精品| 日韩在线综合网| 亚洲丁香日韩| 国产精品欧美风情| 岛国成人毛片| 亚洲国产成人精品久久| 自拍偷拍18p| 中文字幕一区视频| 精品国产免费久久久久久婷婷| 夜夜夜久久久| 香蕉久久免费影视| 国产精品视频一区视频二区 | 日韩免费一区二区| 久久高清免费视频| 久久精品一区八戒影视| 成 人 黄 色 小说网站 s色| 国产精品chinese| 欧美日韩在线观看一区| 日韩av黄色| 97人洗澡人人免费公开视频碰碰碰| 男男电影完整版在线观看| 4438成人网| 日本特黄特色aaa大片免费| 国产欧美日韩另类一区| 日本55丰满熟妇厨房伦| 亚洲欧美激情诱惑| 丰满女人性猛交| 国产精品一线| 91久久久久久久一区二区| 秋霞伦理一区| 久久久www成人免费精品张筱雨| 手机在线观看免费av| 欧美日韩国产小视频| 日韩xxxxxxxxx| 中文字幕中文字幕一区二区| av鲁丝一区鲁丝二区鲁丝三区| 老司机免费视频一区二区三区| 日韩伦理在线免费观看| 99久久99久久精品国产片桃花| 精品国产区在线| 成人51免费| 国产精品免费视频久久久| av电影在线地址| 久久精品国产欧美亚洲人人爽| 免费在线国产| 亚洲国产成人精品久久| 国产日韩在线观看一区| 精品污污网站免费看| 亚洲一区欧美在线| 亚洲美女偷拍久久| 三级黄色在线观看| 国产欧美视频一区二区| 亚洲综合自拍网| 国产乱国产乱300精品| 国产福利影院在线观看| a91a精品视频在线观看| 日本香蕉视频在线观看| 1024精品久久久久久久久| 茄子视频成人在线观看| 亚洲第一福利社区| 久久精品99| 国偷自产av一区二区三区| 亚洲综合在线中文字幕| 亚洲精品一区av| 国产精品日日摸夜夜添夜夜av| 韩国成人免费视频| 欧美成人午夜激情| 高h视频在线观看| 久久精品美女视频网站| 美女羞羞视频在线观看| 中文字幕久热精品在线视频| 国产视频三级在线观看播放| 亚洲精品之草原avav久久| 视频在线不卡| 日韩成人在线观看| 亚洲三区在线观看无套内射| 亚洲国产日韩欧美在线图片| 免费观看成年人视频| 精品久久人人做人人爽| 亚洲国产欧美另类| 精品国产免费人成电影在线观看四季 | 久久久久久久久久久网站| av网址在线免费观看| 久久这里只有精品99| 黄a在线观看| 久久成人av网站| 欧洲黄色一区| 午夜免费久久久久| 在线观看爽视频| 国产精品v片在线观看不卡| 欧美free嫩15| 国产日韩在线播放| 无人区乱码一区二区三区| 不卡一区二区三区视频| 白嫩白嫩国产精品| 另类视频在线观看+1080p| 极品美女一区二区三区| 一本久道久久综合狠狠爱亚洲精品| 久久中文字幕二区| 欧洲精品视频在线| 国产日韩欧美一区| 国产精品乱码久久久久| 国产综合久久久久久鬼色| 中文字幕永久免费| www欧美成人18+| 欧美极品jizzhd欧美18| 夜夜夜精品看看| 国产又爽又黄的视频| 日本高清不卡在线观看| 国产视频aaa| 亚洲黄色成人网| av在线三区| 欧美贵妇videos办公室| 超碰一区二区| 成人免费激情视频| 女人抽搐喷水高潮国产精品| 亚洲v国产v在线观看| 国产精品九九| 国产精品igao| 国产成都精品91一区二区三| 91久久免费视频| 日韩毛片一二三区| 久久精品视频1| 欧美另类高清zo欧美| 少妇人妻精品一区二区三区| 一区二区中文字幕| 国产丝袜精品丝袜| 国产精品尤物福利片在线观看| jizzjizzjizz欧美| 亚洲精品在线视频观看| 伊人久久大香线蕉av超碰演员| 一区二区成人网| 成人免费视频视频| 日本激情视频一区二区三区| 精品国产鲁一鲁一区二区张丽| 一区二区国产欧美| 亚洲另类图片色| 国产蜜臀av在线播放| 国产原创欧美精品| 亚洲精品国模| 国产无限制自拍| 韩国午夜理伦三级不卡影院| 自拍偷拍中文字幕| 夜夜精品视频一区二区| 91九色蝌蚪91por成人| 精品丝袜一区二区三区| 丝袜国产在线| 91精品美女在线| 精品理论电影在线| 亚洲美免无码中文字幕在线| 国内精品久久久久影院色| 亚洲精品一区二区三区影院忠贞| 亚洲成av人片在线| www.我爱av| 久久国产色av| 91精品亚洲一区在线观看| 日本一区二区三区四区高清视频| 亚洲精品欧洲| 农村末发育av片一区二区| 亚洲精品视频在线观看免费| 亚洲天堂手机在线| 国产一区二区三区视频免费| 成人免费看黄| 久久久久se| 国产精品毛片| 国产精品一区二区入口九绯色| 性欧美疯狂xxxxbbbb| 懂色av成人一区二区三区| 色综合老司机第九色激情| 亚洲免费一区| 国产成人免费高清视频| 九九国产精品视频| 一区二区三区在线播放视频| 欧美性三三影院| 番号集在线观看| 国产精品欧美激情在线播放| 93在线视频精品免费观看| 亚洲 激情 在线| 国产精品大尺度| 中文字幕在线视频第一页| 三级精品视频久久久久| 五月天色综合| 中文字幕第一页亚洲| 国产电影精品久久禁18| 欧美精品成人久久| 精品久久久久久久久久久久久久久久久 | 1234区中文字幕在线观看| 国产精品乱子乱xxxx| 亚洲国产一区二区精品专区| 六十路息与子猛烈交尾| 日韩欧美在线第一页| 免费在线毛片| 国产精品自拍视频| 亚洲欧洲中文字幕| 欧洲熟妇的性久久久久久| 精品久久久久久久久久国产| 神马久久精品| 国产精品久久久久久久久久尿| 99九九热只有国产精品| 可以看的av网址| 天天综合天天做天天综合| 免费一级毛片在线观看| 国产精品视频精品| 欧美福利在线| 风间由美一二三区av片| 欧美亚洲自拍偷拍| 99在线视频观看| 久久久福利视频| 麻豆91精品视频| 欧美三级日本三级| 亚洲精品福利在线| 国产美女久久| 91网站在线观看免费| 久久在线免费观看| 国产又粗又黄又爽的视频| 国内免费精品永久在线视频| 精品国精品国产自在久国产应用| 三区视频在线观看| 欧美性xxxx极品hd满灌| 欧洲日本在线| 精品国产中文字幕| 久久99九九99精品| 天堂网一区二区三区| 久久九九国产精品怡红院| 欧洲亚洲一区二区三区| 亚洲欧美日韩精品一区|