this在函數定義的時候不能確定指向,只有在執行的時候進入上下文環境纔會確定。
一:全局函數
function a() {
console.log(this.name); //this.name爲undefined
}
a(); //相當於window.a(), 所以this指向的是window。
二:對象方法
var obj = {
key: "main",
fun: function() {
console.log(this.key);
}
}
obj.fun(); //this指向的是obj這個對象
若obj中存在多層嵌套,this的指向只會是它的上一級對象,即調用它的對象。
var obj = {
key: "main",
item: {
fun: function() {
console.log("key: " + this.key); //this指向爲item對象
}
}
}
但是!!!若將fun方法賦值給某一變量,則this指向就會發生變化,指向變爲該變量的調用對象。
var fun = obj.item.fun;
fun(); //this指向的是window 因爲實際是window.fun();
var a = {m: 1, n:2, key: "abcde"};
a.f = obj.item.fun;
a.f(); //輸出爲 "key: abcde" this的指向爲對象a
三:構造函數
構造函數通過關鍵字new進行實例化,實例化後this指向對象f,f因爲是F1的實例化,F1中有的所有屬性方法都有相同的一份在對象f中,所以f中有屬性name並且等於“JavaScript”。
function F1() {
this.name = "JavaScript";
}
var f = new F1();
console.log(f.name); //"JavaScript"
但是!!!若構造函數中遇到return則情況就不一樣了!
返回值是對象的this指向爲該返回對象,若返回值不是對象,則this指向不變,仍爲構造函數的實例對象
function F1() {
this.name = "JavaScript";
return {}; //或者是[], function(){} 等返回值是一個對象;
}
var f = new F1();
console.log(f.name); //undefined
function F1() {
this.name = "JavaScript";
return 1; //或者是null, undefined, true, false, "xx"等返回值是一個非對象
}
var f = new F1();
console.log(f.name); //"JavaScript"
四:apply/call中使用
修改this的指向,調用某一對象的方法,用另一對象替換當前對象,即將一個函數對象的上下文修改爲指定對象。
Parent.fn.call(Child, ...args); //args參數必須一個個列舉出來
Parent.fn.apply(Child, args); //args是一個數組