为何if中第一个addEventListener生效,注释的不生效?(Udemy课程练习)
问题分析与解决方案
结合Colt Steele《Web开发者训练营》里这个经典的ScoreKeeper练习,你遇到的问题大概率是两种写法在事件绑定逻辑或者目标分数取值时机上存在关键差异,下面具体拆解:
可能的原因1:错误使用函数调用而非函数引用
这是新手最容易踩的坑!假设你的注释代码是这种写法:
// 失效的注释写法 p1Button.addEventListener('click', checkWin()); // 正常运行的写法 p1Button.addEventListener('click', checkWin);
- 正常写法里,
checkWin是函数引用,相当于告诉浏览器:等按钮被点击时,再去执行这个函数。 - 而注释的写法里,
checkWin()是立即执行函数——页面一加载就会立刻运行checkWin,根本没把它绑定到点击事件上。后果就是:要么游戏刚启动就触发结束逻辑,要么点击按钮时完全没有对应的处理函数,自然不会触发分数达标后的结束判断。
可能的原因2:目标分数取值时机固定,未实时更新
课程里的练习带有可修改目标分数的输入框,如果你的注释写法是这样的:
// 失效的注释写法 let winningScore = parseInt(document.querySelector('input').value); // 页面加载时取初始值5 p1Button.addEventListener('click', function() { if (!gameOver) { p1Score++; if (p1Score === winningScore) { // 一直用初始的5,输入框改了也不会变 gameOver = true; // 游戏结束逻辑 } p1Display.textContent = p1Score; } }); // 正常运行的写法 p1Button.addEventListener('click', function() { if (!gameOver) { p1Score++; // 每次点击都实时获取输入框的最新值 let currentWinningScore = parseInt(document.querySelector('input').value); if (p1Score === currentWinningScore) { gameOver = true; // 游戏结束逻辑 } p1Display.textContent = p1Score; } });
- 注释的写法在页面加载时就把
winningScore固定成了输入框的初始值(比如5),之后哪怕你把输入框改成10,代码里的判断逻辑还是拿5来对比——当玩家分数到5时会结束,但到10时不会触发结束,看起来就像是“失效”了。 - 正常写法每次点击按钮时,都会重新读取输入框的最新值,所以不管你怎么修改目标分数,判断逻辑都是基于当前的设定值。
快速排查验证
- 先检查注释的事件绑定代码:如果函数名后面加了括号(比如
checkWin()),去掉括号改成checkWin即可; - 如果是取值时机问题,把获取目标分数的代码移到点击事件的回调函数内部,确保每次点击都取最新值。
内容的提问来源于stack exchange,提问作者Trebuh
相关产品推荐
相关产品推荐

