接著上一節(jié)講的話,應該輪到“執(zhí)行上下文?!绷?,但是這里不得不插入一節(jié),把this說一下。因為this很重要,js的面試題如果不出幾個與this有關的,那出題者都不合格。
其實,this的取值,分四種情況。我們來挨個看一下。
在此再強調(diào)一遍一個非常重要的知識點:在函數(shù)中this到底取何值,是在函數(shù)真正被調(diào)用執(zhí)行的時候確定的,函數(shù)定義的時候確定不了。因為this的取值是執(zhí)行上下文環(huán)境的一部分,每次調(diào)用函數(shù),都會產(chǎn)生一個新的執(zhí)行上下文環(huán)境。
情況1**:構造函數(shù)**
所謂構造函數(shù)就是用來new對象的函數(shù)。其實嚴格來說,所有的函數(shù)都可以new一個對象,但是有些函數(shù)的定義是為了new一個對象,而有些函數(shù)則不是。另外注意,構造函數(shù)的函數(shù)名第一個字母大寫(規(guī)則約定)。例如:Object、Array、Function等。
以上代碼中,如果函數(shù)作為構造函數(shù)用,那么其中的this就代表它即將new出來的對象。
注意,以上僅限new Foo()的情況,即Foo函數(shù)作為構造函數(shù)的情況。如果直接調(diào)用Foo函數(shù),而不是new Foo(),情況就大不一樣了。
這種情況下this是window,我們后文中會說到。
情況2**:函數(shù)作為對象的一個屬性**
如果函數(shù)作為對象的一個屬性時,并且作為對象的一個屬性被調(diào)用時,函數(shù)中的this指向該對象。
以上代碼中,fn不僅作為一個對象的一個屬性,而且的確是作為對象的一個屬性被調(diào)用。結果this就是obj對象。
注意,如果fn函數(shù)不作為obj的一個屬性被調(diào)用,會是什么結果呢?
更多建議: