【深刻理解javascript】this的用法

引用:this的用法html

在函數中this到底取何值,是在函數真正被調用執行的時候肯定的,函數定義的時候肯定不了閉包

狀況1:構造函數

函數做爲構造函數用,那麼其中的this就表明它即將new出來的對象。另外注意,構造函數的函數名第一個字母大寫(規則約定)。例如:Object、Array、Function等。app

還有一種狀況,在構造函數的prototype中,this表明着什麼。函數

如上代碼,在Fn.prototype.getName函數中,this指向的是f1對象。所以能夠經過this.name獲取f1.name的值。this

其實,不單單是構造函數的prototype,即使是在整個原型鏈中,this表明的也都是當前對象的值。spa

注意,以上僅限new Foo()的狀況,即Foo函數做爲構造函數的狀況。若是直接調用Foo函數,而不是new Foo(),狀況就大不同了。prototype

這種狀況下this是window,咱們後文中會說到。htm

狀況2:函數做爲對象的一個屬性

若是函數做爲對象的一個屬性時,而且做爲對象的一個屬性被調用時,函數中的this指向該對象。對象

以上代碼中,fn不只做爲一個對象的一個屬性,並且的確是做爲對象的一個屬性被調用。結果this就是obj對象。blog

注意,若是fn函數不做爲obj的一個屬性被調用,會是什麼結果呢?

如上代碼,若是fn函數被賦值到了另外一個變量中,並無做爲obj的一個屬性被調用,那麼this的值就是window,this.x爲undefined。

狀況3:函數用call或者apply調用

當一個函數被call和apply調用時,this的值就取傳入的對象的值。至於call和apply如何使用,不會的朋友能夠去查查其餘資料。

狀況4:全局 & 調用普通函數

在全局環境下,this永遠是window。

普通函數在調用時,其中的this也都是window。

————————-不過下面的狀況你須要注意一下:————————-

函數f雖然是在obj.fn內部定義的,可是它仍然是一個普通的函數,this仍然指向window。(這就是閉包)

相關文章
相關標籤/搜索