鍍金池/ 問(wèn)答/HTML/ 關(guān)于this的指向;

關(guān)于this的指向;

構(gòu)造函數(shù)中this的指向

相關(guān)代碼

最近在讀js高級(jí)編程,有點(diǎn)迷惑的地方。

在普通的函數(shù)中,this是指向全局作用域的:
var name = 'moon';
function sayName(){

var name = 'star';
console.log(this.name); //moon

}

但是在構(gòu)造函數(shù)里,this是指向誰(shuí):
function Person(name, age){

this.name = name; //這里為啥可以這樣寫,不太明白,雖然我也這樣寫
this.age = age;

}
var p1 = new Person('sun', 22);

書上寫的是: 將構(gòu)造函數(shù)的作用域賦給新對(duì)象,因此this指向了這個(gè)新對(duì)象。為什么第一種情況this是全局作用域,而第二種情況就成了函數(shù)作用域了呢,求解惑

回答
編輯回答
刮刮樂(lè)

單就你題目中的兩個(gè)例子,this都是在運(yùn)行時(shí)才能確定的:即看他們執(zhí)行時(shí)綁定在什么對(duì)象上,那個(gè)this就代指那個(gè)對(duì)象。

  1. sayName這個(gè)函數(shù),
    如果你直接執(zhí)行,它相當(dāng)于在全局執(zhí)行,默認(rèn)綁定在window對(duì)象上(此處先不討論嚴(yán)格模式),故this是window。 var name="moon"在全局定義的,那么它就是window的一個(gè)屬性,相當(dāng)于window.name="moon"。
    若你執(zhí)行 sayName.call({name: 'sun'}), 即將sayName綁定在對(duì)象{name: 'sun'}上執(zhí)行,那么this就是這個(gè)sun對(duì)象。
  2. new操作符執(zhí)行后,會(huì)創(chuàng)建一個(gè)空對(duì)象 {}, 然后類似于執(zhí)行了

    var newObj = {}; 
    Person.call(newObj, name, age);
    var pi = newObj;

    當(dāng)然new做的操作不止這些,還有設(shè)置原型鏈,不在此問(wèn)題討論范圍內(nèi)。

2018年3月21日 10:22