谁能给个详解。。原理到实例
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script type="text/javascript">
var li=document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
li[i].onclick=function( ){
alert(i );
}
}
</script>
</body>
<body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script type="text/javascript">
var li=document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
li[i].onclick=function( ){
alert(i );
}
}
</script>
</body>
可都alert出4。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
</head><body>
<ul>
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script type="text/javascript">
var li=document.getElementsByTagName("li");
for(var i=0;i<li.length;i++){
!function(i){
li[i].onclick=function(){
alert(i);
}
}(i)
}
</script></body>
</html>
楼主是想拿到当前的i值吗?
在绑定事件外层加个立即执行的匿名函数就行了~·
li[i].onclick=function(){
alert(i);
}
就能正确拿到i值了
li[i].onclick=function( ){
alert(i );
}
}像你这么写的话,如果外层不加一个立即执行的函数,它拿到的i值永远是for循环不成立条件的值,也就是4如果外层套一个匿名函数,把当前的i值传入进去,那li[i].onclick=function( ){这个闭包的上层就是那个匿名函数,而那个匿名函数又正好存着当前的i值,所以就能拿到了
因为Javascript是用函数function划分作用域的~·
如果你外层不加一个函数,那这个闭包的上传就是for循环的那个作用域,如果你加上一个函数,那这个闭包的上层就是这个匿名函数的作用域了
这个就是闭包的功劳了
因为 那个 i在你执行click的时候 已经是 4了记住 你的click函数 调用的是 i 不是 i的值
所以 i在变化的话 click的每次调用 只能是 i最后的值
看示例: var i = 0;
i = 1;
i = 2;
function test() {
alert(i);
};
test();直到你运行test()这句时,才知道i的值是2,不运行的时候是不知道的,对吧。来看你的例子,你只是给li赋了一个属性,这个属性的值是一个函数的指针。
但是仅仅是个赋值而已。
仅当你在点击li时,才会计算,而当你点击时,这个全局变量i的值已经变化了不知道这样是不是容易理解一些。
li[i].onclick=function( ){
alert(i );
}
}for 是立即执行的,你点击的时候才会触发alert(i),问题是你点的时候,循环已经结束了,i 已经是 4 了。
for(var i=0;i<li.length;i++){
li[i].onclick=(function(i){return function(){alert(i); } })(i);
}
18楼说的不错,在你触发click的时候,循环已经完了, i已经是4了,所以,不管你单击的是什么,他alert的出来的是4,但是上面的办法是当在绑定click的时候,就执行一个匿名函数,把i当做匿名函数的参数即刻调用,而不等循环结束才调用。而这个匿名函数的返回值也一个函数...