javascript
JS闭包问题(二)
在之前的JS閉包問題(一)文章中大概介紹了一下JS閉包,同時(shí)講了閉包與變量之間的問題,今天我們繼續(xù)聊閉包,聊聊閉包與this對(duì)象之間的問題。
我們知道,this指向當(dāng)前對(duì)象,而在全局環(huán)境中,this就等于window對(duì)象,舉個(gè)例子:
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。
那么遇到閉包又會(huì)是什么樣的結(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對(duì)象指向window,所以上面例子中返回 "The Window"。但是,也存在例外的情況:
① 通過(guò)call()或者apply()改變函數(shù)的執(zhí)行環(huán)境,這時(shí)this會(huì)指向其他對(duì)象
比如還是上面這個(gè)例子,只不過(guò)最后改成這樣:
alert(object.getName().call(object)); // "My Object"雖然還是執(zhí)行同樣一個(gè)匿名函數(shù),但是執(zhí)行環(huán)境卻強(qiáng)制改成了object,這時(shí)的this就指向了object。
② 給HTML元素添加事件,這時(shí)匿名函數(shù)中的this會(huì)指向該事件所在元素
例如:
<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對(duì)象均指向oBtn。
總而言之,this對(duì)象是在運(yùn)行時(shí)基于函數(shù)的執(zhí)行環(huán)境綁定的。
總結(jié)
- 上一篇: pdb学习笔记
- 下一篇: JavaScript动态加载js文件