扫码关注官方订阅号
谁能讲讲这里发生了什么呢?
学习是最好的投资!
去查下作用域的相关知识。i寻值的时候查的是外部的i。此时循环已经完成,i值为3。
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。
异 步 了
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
去查下作用域的相关知识。
i寻值的时候查的是外部的i。此时循环已经完成,i值为3。
1、变量如果没有var关键字定义却赋值,就相当于定义了全局变量i=0;
2、for先执行完毕,i为3;
3、这个时候再执行onlick的方法的时候,i为3,所以alert出来就3;
再看以下:
结果会输出:
为什么?
补充:
这个只是一个扩展提问,或者如何让setTimeout里面打印出来0、1、2
用 es6 最为简单:D
闭包、变量提升,看下着这样的写法,其实结果是一样的。。当i=2是,出循环又i++一次
和大家的答案一样,闭包,作用域。
简单点理解这问题就是,结束循环时i为3
此时onclick还未执行, 所以内部的i自然是3,那么最终执行事件时i就是3了
如果不实用es6的语法,就只能用解决this的方法去解决了,因为循环里面的绑定事件是异步的,可以选择自定义属性的方式/$(this)的方法
还是闭包 作用域的问题
此时循环已经完成,i值为3。
异 步 了