JavaScript中的this解析

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是一個數組





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章