我們來看下面一段代碼:
var MyObject = function() {}
MyObject.prototype.whoAmI = function() {
console.log(this === window ? "window" : "MyObj"); };
var obj = new MyObject();
現(xiàn)在為了方便起見,我們新建一個(gè)變量來指引 whoAmI 方法, 因此我們可以直接用 whoAmI() 而不是更長(zhǎng)的obj.whoAmI():
var whoAmI = obj.whoAmI;
接下來為了確保一切都如我們所預(yù)測(cè)的進(jìn)行,我們可以將 whoAmI 打印出來:
console.log(whoAmI);
結(jié)果是:
function () { console.log(this === window ? "window" : "MyObj"); }
沒有錯(cuò)誤!
但是現(xiàn)在我們來查看一下兩種引用的方法:
obj.whoAmI(); // 輸出 "MyObj" (as expected)
whoAmI(); // 輸出 "window" (uh-oh!)
哪里出錯(cuò)了呢?
原理其實(shí)和上面的第二個(gè)常見錯(cuò)誤一樣,當(dāng)我們執(zhí)行 var whoAmI = obj.whoAmI;的時(shí)候,新的變量 whoAmI 是在全局環(huán)境下定義的。因此它的this 是指window, 而不是obj!
正確的編碼方式應(yīng)該是:
`var MyObject = function() {}
MyObject.prototype.whoAmI = function() {
console.log(this === window ? "window" : "MyObj"); };
var obj = new MyObject();
obj.w = obj.whoAmI; // still in the obj namespace obj.whoAmI(); // 輸出 "MyObj" (as expected)
obj.w(); // 輸出 "MyObj" (as expected) `
更多建議: