javascript - js的for丢失this的问题
阿神
阿神 2017-04-11 12:53:02
[JavaScript讨论组]
for(var i = 0; i < 10;i++){
        arr[i].onclick = function(){
          alert(i);
        }

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

阿神
阿神

闭关修行中......

全部回复(7)
PHP中文网

(注意:for循环不能创造新的作用域!)

而里面的匿名函数,是可以访问上级的作用域(也就是作用域A)中的变量i的,所以最后打印出来的肯定都是上级的i,即最后的10

简单的说,这里面你最后出来的i,其实都是那一个i

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

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).

PHPz

循环体内只是给点击事件绑定一个函数,不是函数调用
而当点击事件触发时调用对应函数时循环已经结束了,此时i=10,所以函数调用结果自然就是10;

for(var i = 0;i<10;i++){
    alert(i)
    }

这种情况下循环体内是函数调用,所有输出的是当前i

ringa_lee

i<10改成i<arr.length试试 也许能满足你需求

阿神

因为函数是不能自主执行的,js在解析时会直接执行for循环部分,而跳过函数。只有当点击事件发生时,才会触发绑定的函数,而此时的for循环已经遍历完了,即i已经是最后一个值了。因此,函数接收到的i值为最后一个。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号