代码改变世界

js 匿名函数 闭包

2009-12-02 20:38  曾祥展  阅读(5239)  评论(1编辑  收藏
没有弹出框
<script language="javascript" type="text/javascript">
function start(){
var nid=document.getElementsByTagName("li");
nid.onclick=function(){alert("4");}
}
window.onload=start;
</script>

 

这样才有弹出对话框

<script language="javascript" type="text/javascript">
function start(){
var nid=document.getElementsByTagName("li");
nid.onclick=(function(){alert("4");})()
}
window.onload=start;
</script>

 

运行后,不论点击哪一个li,都是alert提示“4”。

这就是一个需要注意的地方:

闭包允许内层函数引用父函数中的变量,但是该变量是最终值。闭包引用的变量i,是循环结束后的值

<script language="javascript" type="text/javascript">
var li=document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
li[i].onclick=function(){alert(i);}
}
</script>

 

用闭包来解决

<script language="javascript" type="text/javascript">
var li=document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
   (function(index){
   li[index].onclick=function(){alert(index);}
   })(i);
}
</script>

 

 

 

注意顺序:先弹出“clicked” 再弹出“also clicked”

<script>
var fnClick1 = function(){ alert("clicked"); };
var fnClick2 = function(){ alert("also clicked"); };
var oDiv = document.getElementById("div");
oDiv.attachEvent("onclick",fnClick2);
oDiv.attachEvent("onclick",fnClick1);
</script>

 先弹出“also clicked” 再弹出“clicked”

var oDiv = document.getElementById("div");
oDiv.attachEvent("onclick",fnClick1);
oDiv.attachEvent("onclick",fnClick2);

 

 

.onclick后面的是最先执行的
attachEvent进去的事件 就DOM的解释是乱续的。
但实际测试时 IE是后绑定的先执行,FF是先绑定的先执行.