为什么addEventListener返回undefined?点击按钮无响应如何解决?
问题原因与解决方案
一、rockClick为undefined的原因
addEventListener方法本身没有返回值,调用后必然返回undefined,这是该API的正常特性,不是bug。你不需要关注这个变量的值,核心问题是点击按钮无响应。
二、点击按钮无响应的原因
你的bind用法完全错误,导致绑定的函数逻辑不符合预期:
bind的第一个参数是用来绑定函数内部的this指向,不是函数的第一个参数。你把"rock"放在第一个位置,会让playRound里的this变成字符串"rock",而非把"rock"作为函数参数传入。- 你直接写了
computerPlay(),这会在页面加载时就立即执行这个函数,把执行结果(比如电脑第一次的选择)当成固定参数传给playRound,而不是点击按钮时才调用computerPlay()获取最新的选择。 - 错误的参数顺序+提前执行函数,导致
playRound没有拿到预期的参数,自然无法正常触发游戏逻辑。
三、解决方法
放弃用bind,改用匿名箭头函数包裹,确保点击按钮时才执行computerPlay()并传入正确参数:
// 替换原来的绑定代码 rockBtn.addEventListener('click', () => playRound("rock", computerPlay()));
这样每次点击按钮时,会重新调用computerPlay()生成电脑的选择,同时把"rock"作为玩家选择传给playRound,完全符合你的预期逻辑。
如果一定要用bind,需要调整参数顺序,同时用函数包裹computerPlay()(但这种写法没必要,不如箭头函数直观):
// 不推荐,仅作演示 rockBtn.addEventListener('click', function() { playRound.bind(null, "rock", computerPlay())(); });
内容的提问来源于stack exchange,提问作者jared-dev
相关产品推荐
相关产品推荐

