【版權聲明】未經博主同意,謝絕轉載!(請尊重原創,博主保留追究權)
https://blog.csdn.net/m0_69908381/article/details/140092319
出自【進步*于辰的博客】
參考筆記二,P6.1;筆記三,P72、P73.1。
先言
我很早就知曉JS的這個知識點——this
的重要性,并特意系統學習、理解并有所筆記,但限于平日用得少,對其的理解慢慢淡化。
前段時間打算復習一下,一翻閱筆記“懵逼”,因為我的筆記是經個人理解后“精簡”的,若后來有所淡忘再去看必然難免一些地方不理解,無妨,再去系統學一遍。
你肯定會問:“你明知this
這個知識點的重要性,平日怎么會少用,進而淡忘?” 有句話你肯定聽過,“面試造航母,開發擰螺絲”。(PS:這次不是為了面試,而是出于工作需要,有必要鞏固一些JS基礎)
啟發博文:《js中this究竟指向哪里?現在終于搞定了!》(轉發)。
我覺得這位哥們總結得很全面,解決了我所有的疑惑。我也有所筆記,特作此文。當然,不是做一個“搬運工”(PS:那樣沒意義)。
前面我說過,我的筆記是經個人理解后“精簡”的,故你可能不一定能理解它們(出于個人時間考慮,我暫不打算對它們進行舉例說明和擴展)。如果你一臉懵逼,還是移步【啟發博文】吧。
早期筆記
1:this
指向類似引用,this.xx
即訪問調用它的對象的xx
屬性,此時this
指向調用它的對象。(注:所謂“調用”,不是指僅“寫出來”,而是“訪問”)
2:當函數中有this
時,this
一定指向函數的上一級對象。訪問變量時(this.xx
),若函數中存在此變量聲明(this.xx = xx
),則訪問該變量,否則訪問函數的上一級對象的xx
屬性。此時,this
指向函數的上一級對象,而不是函數。
3:this
的指向在調用時確定,函數的確可以實例化,但本身不是對象,故this
不會指向它。
4:函數可作為變量傳遞,但函數不是對象,故若要訪問函數的局部變量,需實例化。
5:若函數的返回值是對象(對象或函數),則this
指向該對象,否則指向此函數的實例(返回值無效)。特例:若函數返回undefined
或null
,盡管null
也是對象,但this
仍指向此函數實例(實例化會改變this
指向)。
以上就是我早期學習
this
時所作的筆記,這樣怎會讓人不“懵逼”。如今看來,雖然有點“抽象”,但經我核對,這些筆記本身是無誤的,正好應對this
使用時諸多的“復雜”情況。所謂“存在即合理”,于是我也將它們“遷移”過來了。
如今筆記
1:JS規定:由于this
一定指向對象,故即便this
所指向的對象中不存在屬性a
,this.a
返回的是undefined
,而非報錯。
2:對象定義中的this
一定指向該對象,如:使用字面量定義對象的屬性的屬性值為函數引用,函數中的this
。
3:this
也應遵循“詞法作用域”。
4:this
指向調用者(對象)。若函數引用作為對象屬性,如:字面量、構造函數(this.fun = fun
),則函數內的this
指向該對象;若函數調用語句作為對象屬性,如:字面量、構造函數(this.fun = fun
),則函數內的this
指向全局對象。
5:假設對象obj1
依賴obj2
(字面量定義),調用obj1.obj2.fun()
同樣遵循 第4點,可理解為“就近原則”。
6:在全局作用域下定義的函數若在全局作用域下調用,函數內的this
一定指向全局對象。有三種方法可改變this
指向(顯式綁定):
fun.call(obj, arg1, ...)
;fun.apply(obj, [arg1, ...])
;fun.bind(obj, arg1, ...)
。
其中,前2個在指定this
指向的同時調用,而bind()
只作相應綁定,并未調用,其返回作綁定后的“新函數”,故需再調用(newFun()
)。
再調用時也可指定實參。若調用bind()
時未指定全部實參,再指定的實參可作為“候補”,否則,再指定實參無效(不會覆蓋)。
注意:
arg1, ...
與[arg1, ...]
是固定格式。其中,調用apply()
時,即便只有一個形參,也必須是列表。obj
必須是對象才有效(改變this
指向),若obj
是函數,則this
仍指向全局對象。
重申一遍:如果你仍然覺得一臉懵逼,還是移步【啟發博文】吧。
本文完結。
上一篇:[JavaScript]作用域的“生產者”——詞法作用域。