遇见此问题,代码检查了n次都没毛疒,但是却出现下述问题, 坑了我好久,原来是这个原因,记录避坑!
PS这是js的处理方法, 在jquery中直接用each遍历元素绑定点击事件即可避免
比如页面上有一个ul数个li,现在给li添加点击事件
但是,这样写之后我们发现点击任何一个li,打印的值都为5这是因为闭包中共用i值,而i的值由于执行forfor循環i都变为了5
为了正常显示i值,我们可以使用如下方法:
杭州堆栈科技有限公司版权所有
CDN 存储服务由 赞助提供
阿里巴巴(中国)网络技术有限公司 高级前端工程师
图例:绿框为函数执行的栈内存,粉色为堆内存0XAA为内存地址(存储着函数的字符串,并不会执行当函数被调用时才会拿出来执行),沿着主流程从上到下看来看在修改之前的原始版分中arr中每一项执行时,都会去上级作用域寻找i而i在forfor循环i执行结束后就已经变成了4,所以arr中每一项执行的结果都是一样的函数在预解释阶段,都被当成字符串存入堆内存在真正执行时,財会被拿出来执行数组中存储的,其实只是指向这个堆内存的指针i并没有传进去,执行的时候i才被传进去
至于什么js缺陷、bug之类的论调大可歇歇了(至少这个問题不算是bug)开惯了自动挡的人,非要嘲笑手动挡的车离合油门配合不当容易熄火有意思么?人家原理就是这样的至少作为前端语訁还是不错的。非要拉出去和工业语言一较高下算我没说。
遇见此问题,代码检查了n次都没毛疒,但是却出现下述问题, 坑了我好久,原来是这个原因,记录避坑!
PS这是js的处理方法, 在jquery中直接用each遍历元素绑定点击事件即可避免
比如页面上有一个ul数个li,现在给li添加点击事件
但是,这样写之后我们发现点击任何一个li,打印的值都为5这是因为闭包中共用i值,而i的值由于执行forfor循環i都变为了5
为了正常显示i值,我们可以使用如下方法: