在之前的JS閉包問題(一)文章中大概介紹了一下JS閉包议惰,同時講了閉包與變量之間的問題揽咕,今天我們繼續(xù)聊閉包意狠,聊聊閉包與this對象之間的問題粟关。
我們知道疮胖,this指向當(dāng)前對象环戈,而在全局環(huán)境中,this就等于window對象澎灸,舉個例子:
var name = "The Window";
var object = {
name: "My Object",
getName: function(){
return this.name;
}
}
alert(this); // [object Window]
alert(this.name); // "The Window"
alert(object.getName()); // "My Object"
上面例子很好理解院塞,在全局環(huán)境中,name == window.name == this.name性昭,而object.getName中的this指向object拦止。
那么遇到閉包又會是什么樣的結(jié)果呢?我們接著往下看:
var name = "The Window";
var object = {
name: "My Object",
getName: function(){
return function(){
return this.name;
}
}
}
alert(object.getName()()); // "The Window"
通常情況下,匿名函數(shù)的執(zhí)行環(huán)境具有全局性汹族,this對象指向window萧求,所以上面例子中返回 "The Window"。但是顶瞒,也存在例外的情況:
① 通過call()或者apply()改變函數(shù)的執(zhí)行環(huán)境夸政,這時this會指向其他對象
比如還是上面這個例子,只不過最后改成這樣:
alert(object.getName().call(object)); // "My Object"
雖然還是執(zhí)行同樣一個匿名函數(shù)榴徐,但是執(zhí)行環(huán)境卻強(qiáng)制改成了object守问,這時的this就指向了object。
② 給HTML元素添加事件坑资,這時匿名函數(shù)中的this會指向該事件所在元素
例如:
<input type="button" id="btn" value="點(diǎn)擊我吧" />
var oBtn = document.getElementById("btn");
oBtn.onclick = function(){
alert(this.value); // "點(diǎn)擊我吧"
}
oBtn.addEventListener('click',function(){
alert(this.value); // "點(diǎn)擊我吧"
});
可以看出耗帕,不管哪種綁定事件方式,匿名函數(shù)中的this對象均指向oBtn袱贮。
總而言之仿便,this對象是在運(yùn)行時基于函數(shù)的執(zhí)行環(huán)境綁定的。