为了账号安全,请及时绑定邮箱和手机立即绑定

为什么点击都打印出6,而不是0,1,2,3,4,5 闭包的问题?

为什么点击都打印出6,而不是0,1,2,3,4,5 闭包的问题?

江户川乱折腾 2019-05-23 11:02:58
选项1选项2选项3选项4选项5选项6li{border:1pxsolid;}varitems=document.querySelectorAll("li");for(vari=0;i
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

这个涉及到js作用域以及js的运行机制。你把这些基础知识弄明白了,就不会感觉奇怪了。在es6之前是没有块级作用域的概念的,只有全局作用域和函数作用域,所以这里有两种作用域,click回调的函数作用域,全局作用域(for循环不会产生块级作用域),也就是说i属于全局作用域。click回调里面调用了i值,但里面并没有定义,这个变量就叫做自由变量,js对自由变量取值的逻辑是会沿着作用域链向上寻找,直到找到值,或找不到值为止,当你点击触发回调的时候,函数作用域内没有该变量就会向上寻找,即全局作用域,此时全局作用域中的i值已经为6了(这一点看明白,很重要)。所以你log数出来的每次都是6。
                            
查看完整回答
反对 回复 2019-05-23
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

es6:
varitems=document.querySelectorAll("li");
for(leti=0;iitems[i].onclick=function(){
console.log(i)
}
}
es5:
varitems=document.querySelectorAll("li");
for(vari=0;i(function(i){
items[i].onclick=function(){
console.log(i)
}
})(i)
}
for循环直接就运行了跑了6次,等你点击的时候i已经等于5
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 258 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号