有一點很重要,this是個變色龍,它指向誰是不定的,也不是在函數定義的時候確定的
栗子1:
<pre name="code" class="html">function a(){
var user = "追夢子";
console.log(this.user); //undefined
console.log(this); //Window
}
a();
window.a();
栗子中的函數a 是window的一個屬性,alert也是,this是指向調用它的對象的,函數a被window調用,故第二個輸出爲Window,而Window中沒有user這個屬性,故爲undefined.
栗子2:
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //12
}
}
}
o.b.fn();
還有個中重要的情況:this指向的是執行它的主體,而不是賦值的主體。
var o = {
a:10,
b:{
a:12,
fn:function(){
console.log(this.a); //undefined
console.log(this); //window
}
}
}
var j = o.b.fn;
j();
如果一個函數中有this,這個函數中包含多個對象,儘管這個函數是被最外層的對象所調用,this指向的也只是它上一級的對象在構造函數中,如果返回值是一個對象,那麼this指向的就是那個返回的對象,如果返回值不是一個對象那麼this還是指向函數的實例
function fn(){
this.num = 1;
}
var a = new fn();
console.log(a.num); //1
首先new關鍵字會創建一個空的對象,然後會自動調用一個函數apply方法,將this指向這個空對象,這樣的話函數內部的this就會被這個空的對象替代。