先看看代码,然后点击连接看返回的值是不是你所预料的呢?
one : function(){
var links = document.getElementById("one").getElementsByTagName("a");
for (var i = 0; i < links.length; i++){
var link = links[i];
link.onclick = function(){
alert(link.getAttribute("href"));
return false;
}
}
}
代码并不会按照预期的方式运行,每一个连接的返回都是 #4.
two : function(){
var links = document.getElementById("two").getElementsByTagName("a");
for (var i = 0; i < links.length; i++){
var link = links[i];
link.onclick = function(){
alert(this.getAttribute("href"));
return false;
}
}
}
使用this关键字能指向被调用的对象。
three : function(){
var attachLinkEvent = function(link){
link.onclick = function(){
alert(link.getAttribute("href"));
return false;
}
}
var links = document.getElementById("three").getElementsByTagName("a");
for (var i = 0; i < links.length; i++){
var link = links[i];
attachLinkEvent(link);
}
}
为什么定义一个函数再调用就可以保持links[i]不会被运行时销毁?因为JavaScript的垃圾回收器不会回收闭包(嵌套函数需要引用外部函数的参数)。
four : function(){
var links = document.getElementById("four").getElementsByTagName("a");
for (var i = 0; i < links.length; i++){
(function(){
var link = links[i];
link.onclick = function(){
alert(link.getAttribute("href"));
return false;
}
})();
}
}
其实用一个匿名函数更优雅……
five : function(){
var links = document.getElementById("four").getElementsByTagName("a");
for (var i = 0; i < links.length; i++){
(function(){
var link = links[i];
link.onclick = function(){
alert(this.getAttribute("href"));
return false;
}
})();
}
}
闭包里的this