扫码关注官方订阅号
for(var i = 0; i < 10;i++){ arr[i].onclick = function(){ alert(i); }
为什么每次都是10呢?我知道用闭包解决这个问题,但是我想知道为什么每次都是10,为什么最外层的i一直是10??
闭关修行中......
(注意:for循环不能创造新的作用域!)
而里面的匿名函数,是可以访问上级的作用域(也就是作用域A)中的变量i的,所以最后打印出来的肯定都是上级的i,即最后的10
简单的说,这里面你最后出来的i,其实都是那一个i
for(var i = 0; i < 10;i++){ arr[i].onclick = function(){ var j = i; alert(j); }
alert出的i都是同一个。。遍历完 i自然=10啊。。。
因为js不是块级作用域啊!赋给onclick的这个匿名function的作用域链里面的i就是全局的那个i,全局的i在循环之后已经是10了,当你触发匿名函数的时候访问的就是10。
因为你在for循环里给数组中的每个元素添加了点击事件,点击事件是什么呢?是执行一个函数,函数的作用是alert(i)并不是alert(1.2.3.4.5...),i是一个变量,for循环会不断改变i里边的值,直到循环结束i=10,i<10不成立,跳出循环循环结束,这时i的值是10,你alert(i)自然就是alert(10).
循环体内只是给点击事件绑定一个函数,不是函数调用而当点击事件触发时调用对应函数时循环已经结束了,此时i=10,所以函数调用结果自然就是10;
for(var i = 0;i<10;i++){ alert(i) }
这种情况下循环体内是函数调用,所有输出的是当前i
i<10改成i<arr.length试试 也许能满足你需求
因为函数是不能自主执行的,js在解析时会直接执行for循环部分,而跳过函数。只有当点击事件发生时,才会触发绑定的函数,而此时的for循环已经遍历完了,即i已经是最后一个值了。因此,函数接收到的i值为最后一个。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
(注意:for循环不能创造新的作用域!)
而里面的匿名函数,是可以访问上级的作用域(也就是作用域A)中的变量i的,所以最后打印出来的肯定都是上级的i,即最后的10
简单的说,这里面你最后出来的i,其实都是那一个i
alert出的i都是同一个。。遍历完 i自然=10啊。。。
因为js不是块级作用域啊!赋给onclick的这个匿名function的作用域链里面的i就是全局的那个i,全局的i在循环之后已经是10了,当你触发匿名函数的时候访问的就是10。
因为你在for循环里给数组中的每个元素添加了点击事件,点击事件是什么呢?是执行一个函数,函数的作用是alert(i)并不是alert(1.2.3.4.5...),i是一个变量,for循环会不断改变i里边的值,直到循环结束i=10,i<10不成立,跳出循环循环结束,这时i的值是10,你alert(i)自然就是alert(10).
循环体内只是给点击事件绑定一个函数,不是函数调用
而当点击事件触发时调用对应函数时循环已经结束了,此时i=10,所以函数调用结果自然就是10;
这种情况下循环体内是函数调用,所有输出的是当前i
i<10改成i<arr.length试试 也许能满足你需求
因为函数是不能自主执行的,js在解析时会直接执行for循环部分,而跳过函数。只有当点击事件发生时,才会触发绑定的函数,而此时的for循环已经遍历完了,即i已经是最后一个值了。因此,函数接收到的i值为最后一个。