按钮绑定事件Bug:重赋值getRes后num值不更新的原因探究
问题原因解析
1. bind方法的累积绑定特性是核心问题
你遇到的num值始终不变,本质是因为**bind返回新函数且参数是累积的,不会覆盖原有绑定的参数**:
- 第一次循环时,你基于原始
getRes函数绑定resolve和i=0,得到新函数A,然后把全局getRes替换成A。此时调用A会固定传入resolve0和0到原始getRes。 - 第二次循环时,你基于函数A再次绑定
resolve1和i=1,得到新函数B。调用B时,会把resolve1和1作为额外参数传给A,但A已经预设了前两个参数,原始getRes只会取前两个参数(resolve0和0),所以打印的num还是0。 - 后续循环重复这个逻辑,每次都是在已绑定参数的函数基础上追加新参数,原始
getRes始终只使用第一次绑定的num=0,导致点击后num值不变。
2. 直接绑定btn.onclick为什么正常
当你直接给按钮的onclick赋值绑定后的函数时:
- 如果你没有修改全局
getRes,每次循环都是基于原始getRes函数去绑定当前的resolve和i,生成的新函数都是独立的,各自预设了当前循环的参数。 - 每次赋值都会覆盖按钮之前的点击处理函数,所以点击时执行的是对应循环中绑定的函数,自然能打印正确的
num值。
3. HTML属性onclick="getRes"的绑定逻辑
HTML中onclick="getRes"的绑定是页面初始化时一次性完成的:
- 浏览器解析页面时,会把当时全局的原始
getRes函数作为按钮的点击处理函数,之后无论你怎么修改全局getRes变量,按钮的处理函数始终是最初的原始函数引用,不会动态更新。 - 这也导致,即使你修改了全局
getRes,点击按钮时执行的还是原始函数,而原始函数需要的resolve和num参数并没有被传入,进一步加剧了num值异常的问题。
内容的提问来源于stack exchange,提问作者jw krismile
相关产品推荐
相关产品推荐

