js的for丢失this的问题

for(var i = 0; i < 10;i++){
        arr[i].onclick = function(){
          alert(i);
        }

为什么每次都是10呢?
我知道用闭包解决这个问题,但是我想知道为什么每次都是10,为什么最外层的i一直是10??

阅读 3.9k
7 个回答

(注意: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值为最后一个。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题