for(var i = 0; i < 10;i++){
arr[i].onclick = function(){
alert(i);
}
为什么每次都是10呢?
我知道用闭包解决这个问题,但是我想知道为什么每次都是10,为什么最外层的i一直是10??
for(var i = 0; i < 10;i++){
arr[i].onclick = function(){
alert(i);
}
为什么每次都是10呢?
我知道用闭包解决这个问题,但是我想知道为什么每次都是10,为什么最外层的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
因为函数是不能自主执行的,js在解析时会直接执行for循环部分,而跳过函数。只有当点击事件发生时,才会触发绑定的函数,而此时的for循环已经遍历完了,即i已经是最后一个值了。因此,函数接收到的i值为最后一个。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
(注意:for循环不能创造新的作用域!)
而里面的匿名函数,是可以访问上级的作用域(也就是作用域A)中的变量i的,所以最后打印出来的肯定都是上级的i,即最后的10
简单的说,这里面你最后出来的i,其实都是那一个i