js的for循环闭包问题

一个简单的例子,如果想循环输出数组中的每一个数值我们可以利用for循环来输出例如:

<script type="text/javascript">
var arr=["a","b","c","d","e"];
for (var i=0;i<arr.length;i++){
    document.write(arr[i]);
}
</script>

这是最常见不过的一种了,i从0循环到5把数组中的5个值都输出出来,这里的i正好是arr数组的下标,所以循环出来了~但是看下面的例子又会跟我们想的不一样

<a href="#">text</a>
<br>
<a href="#">link</a>
<script type="text/javascript"> var as = document.getElementsByTagName(‘a‘); for ( var i = as.length; i--; ) {   as[i].onclick = function() {    alert(i);     return false;   } }</script>

这个时候的会始终弹出-1来,因为里面的函数(onclick=function(){})根本没有i这个变量,换句话说i是无法在这个函数中调用的,因为没有传进值来,所以js会去回溯到父级去找这个i变量,当找到i的时候这个for循环其实已经循环完了,这样i就边城了-1所以每次弹出的就都是-1了,想解决这个问题也简单,用闭包传参的形式就可以了代码如下:

<a href="#">text</a>
<br>
<a href="#">link</a>
<script type="text/javascript">
var as = document.getElementsByTagName(‘a‘);
for ( var i = as.length; i--; ) {
  as[i].onclick =( function() {
    alert(i);
    return false;
  })(i);
}
</script>

这样就可以把i作为参数传给里面的函数使用了。

时间: 2024-12-10 17:06:22

js的for循环闭包问题的相关文章

js中for循环闭包问题记录

<script type="text/javascript"> window.onload = function(){ var aImg = document.getElementsByTagName('img'); for(var i=0;i<3;i++){ alert(i); //0,1,2 aImg[i].onclick = function(){ alert(i); //3 } } alert(i);//循环外值依旧为3 } </script> .

js作用域for循环闭包问题

for(var i = 0;i<btnArr.length;i++){ btnArr[i].addEventListener('click',function(){ tabCardShow(i); }): } 普通的for循环,触发事件时传入的 i 的值一定是等于 btnArr.length ,i 的值停留在了循环执行完毕之后,并不符合初衷. 原因:i只作用于 for循环的作用域,所有 元素绑定时传入的都是该作用域的同一个 i 值,而 i 值停留在了循环最后一次的值上. for(var i =

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之前一直做使用Java语言开发,其丰富的组件类库使得开发效率那叫一个快呀!突然转来做JavaScript一时间还有点儿不适应(快半年了),不过自从看见那么多漂亮的网站和对JavaScript接触的越来越多,也发现了其中的一些乐趣.正如自己一直坚信的那样,编程语言仅仅是工具,重要的是编程思想!使用Jav

js中的循环语句

js中的循环语句可分为三种:1.while:2.do……while:3.for. while的语法为 while (exp) {    //statements;} var a=1,b=0; while(a<=1000){ if(a%2==0){ if(b%20==0) { document.write("<br>第"+parseInt(b/20+1)+"行偶数"); } document.write(a+"&nbsp"

js种的循环语句

1 //js种的循环语句 2 //while与do while的区别是while是满足条件后才执行 3 //do while是不管满不满足条件都会执行一次 4 //for 循环与while,do while相比循环结构更加清晰 5 6 //while 循环 7 var a=0; 8 while(a<=5){ 9 a++; 10 console.log(a);//输出1...6 11 12 } 13 14 //do while 循环 15 var b=0; 16 do{ 17 console.lo

js jquery 结束循环

js 中跳出循环用break,结束本次循环用continue, jquery 中each循环 跳出用return true,或者return false, 下面的代码的本意是输入组名查找组id,如果没有找到返回'nofind',在实际执行过程中,当找到组id的时候,执行了 return n.PLM_ID,这句后,还是红继续执行了return 'nofind',也就是无论找没找到,都是返回nofind,经过查找确认才发现jquery中结束循环只能用return false 或者 retunr tr

循环闭包的影响以及其解决方案

上一次,我已经讲过闭包是如何形成的,以及它的用途.但是对于循环闭包产生的陷阱,和解决方案一笔带过啊(根本就没有)!本着不坑爹的思想,绝逼是要重新再梳理一遍.但无论如何还是要强调一下的,在闭包中会一直引用变量(是引用而不是副本),直到其断开连接不再引用,在内存中的闭包就可以得到释放.所以当我们知道这个道理之后,我们就可以开始我们今天的旅程了. 上次的例子举的不够好,竟然要操作DOM的,这次我们换个更直观的写法,用setTimeout函数. show code! 这一次使用的是定时器setTimeo

js 图片无缝循环

<html> <head> <title>Js图片无缝滚动</title> <style type="text/css"> body{ background:gray; } #wrap{ width:810px; height:200px; border:1px solid black; position:relative; left:50%; top:50%; margin-left:-410px; margin-top:-

JS、for循环语句知识巩固,while(){}语句以及do{}while()语句以及switch()语句

一.for循环语句练习 关于for循环存在的两个问题类型 穷举:在不知道什么情况下才真的寻要我们的结果,自能让我们一个个走一遍. 迭代:在现有的条件根据规律不断求解,中间情况,最终推测出来的结果 1.99乘法表 <script>for(var i=1;i<=9;i++){ for(j=1;j<=i;j++) { document.write(j+"*"+i+"="+i*j+"  ") } document.write(&q