(10)——this

2018-02-24 15:45 更新

接著上一節(jié)講的話,應(yīng)該輪到“執(zhí)行上下文棧”了,但是這里不得不插入一節(jié),把this說一下。因?yàn)閠his很重要,js的面試題如果不出幾個(gè)與this有關(guān)的,那出題者都不合格。

其實(shí),this的取值,分四種情況。我們來挨個(gè)看一下。

在此再?gòu)?qiáng)調(diào)一遍一個(gè)非常重要的知識(shí)點(diǎn):在函數(shù)中this到底取何值,是在函數(shù)真正被調(diào)用執(zhí)行的時(shí)候確定的,函數(shù)定義的時(shí)候確定不了。因?yàn)閠his的取值是執(zhí)行上下文環(huán)境的一部分,每次調(diào)用函數(shù),都會(huì)產(chǎn)生一個(gè)新的執(zhí)行上下文環(huán)境。

情況1**:構(gòu)造函數(shù)**

所謂構(gòu)造函數(shù)就是用來new對(duì)象的函數(shù)。其實(shí)嚴(yán)格來說,所有的函數(shù)都可以new一個(gè)對(duì)象,但是有些函數(shù)的定義是為了new一個(gè)對(duì)象,而有些函數(shù)則不是。另外注意,構(gòu)造函數(shù)的函數(shù)名第一個(gè)字母大寫(規(guī)則約定)。例如:Object、Array、Function等。

以上代碼中,如果函數(shù)作為構(gòu)造函數(shù)用,那么其中的this就代表它即將new出來的對(duì)象。

注意,以上僅限new Foo()的情況,即Foo函數(shù)作為構(gòu)造函數(shù)的情況。如果直接調(diào)用Foo函數(shù),而不是new Foo(),情況就大不一樣了。

這種情況下this是window,我們后文中會(huì)說到。

情況2**:函數(shù)作為對(duì)象的一個(gè)屬性**

如果函數(shù)作為對(duì)象的一個(gè)屬性時(shí),并且作為對(duì)象的一個(gè)屬性被調(diào)用時(shí),函數(shù)中的this指向該對(duì)象。

以上代碼中,fn不僅作為一個(gè)對(duì)象的一個(gè)屬性,而且的確是作為對(duì)象的一個(gè)屬性被調(diào)用。結(jié)果this就是obj對(duì)象。

注意,如果fn函數(shù)不作為obj的一個(gè)屬性被調(diào)用,會(huì)是什么結(jié)果呢?

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)