javascript - 这个为什么弹出来的是3?
PHPz
PHPz 2017-04-11 11:10:01
[JavaScript讨论组]

谁能讲讲这里发生了什么呢?










PHPz
PHPz

学习是最好的投资!

全部回复(8)
高洛峰

去查下作用域的相关知识。
i寻值的时候查的是外部的i。此时循环已经完成,i值为3。

ringa_lee

1、变量如果没有var关键字定义却赋值,就相当于定义了全局变量i=0;
2、for先执行完毕,i为3;
3、这个时候再执行onlick的方法的时候,i为3,所以alert出来就3;
再看以下:

for(i = 0;i < 3; i++){
   setTimeout(function(){
     console.log(i)
   },0)
}

结果会输出:

3
3
3

为什么?

补充:
这个只是一个扩展提问,或者如何让setTimeout里面打印出来0、1、2

高洛峰

用 es6 最为简单:D

for(let i = 0; i < 3; i++) {
    // 代码
}
迷茫

闭包、变量提升,看下着这样的写法,其实结果是一样的。。当i=2是,出循环又i++一次

 window.onload=function(){
    var oBtn1=document.getElementById('btn1');
    for(i=0;i<3;i++){
        console.log(i);
    }
    console.log(i);
    oBtn1.onclick=function(){
        alert(i);
    }
 } 
怪我咯

和大家的答案一样,闭包,作用域。
简单点理解这问题就是,结束循环时i为3
此时onclick还未执行, 所以内部的i自然是3,那么最终执行事件时i就是3了

伊谢尔伦

如果不实用es6的语法,就只能用解决this的方法去解决了,因为循环里面的绑定事件是异步的,可以选择自定义属性的方式/$(this)的方法

巴扎黑

还是闭包 作用域的问题
此时循环已经完成,i值为3。

ringa_lee

异 步 了

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

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