引用:this的用法html
在函數中this到底取何值,是在函數真正被調用執行的時候肯定的,函數定義的時候肯定不了閉包
函數做爲構造函數用,那麼其中的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
若是函數做爲對象的一個屬性時,而且做爲對象的一個屬性被調用時,函數中的this指向該對象。對象
以上代碼中,fn不只做爲一個對象的一個屬性,並且的確是做爲對象的一個屬性被調用。結果this就是obj對象。blog
注意,若是fn函數不做爲obj的一個屬性被調用,會是什麼結果呢?
如上代碼,若是fn函數被賦值到了另外一個變量中,並無做爲obj的一個屬性被調用,那麼this的值就是window,this.x爲undefined。
當一個函數被call和apply調用時,this的值就取傳入的對象的值。至於call和apply如何使用,不會的朋友能夠去查查其餘資料。
在全局環境下,this永遠是window。
普通函數在調用時,其中的this也都是window。
————————-不過下面的狀況你須要注意一下:————————-
函數f雖然是在obj.fn內部定義的,可是它仍然是一個普通的函數,this仍然指向window。(這就是閉包)