JS计算器点击等号报Invalid left-hand side in assignment错误如何解决
错误触发原因
- 你给所有
button元素都绑定了通用点击事件,点击时会把按钮的文本内容追加到score.textContent里,包含等号按钮。点击等号时会先触发这个通用事件,把等号文本追加到表达式末尾,再触发等号的专属点击事件调用eval。此时传入eval的字符串类似1+1=,属于不合法的JS表达式,相当于尝试给表达式的计算结果赋值,没有合法的左操作数,就会抛出「Invalid left-hand side in assignment」错误。 - 乘法按钮用的文本是
x,不是JS识别的乘法运算符*,就算解决了等号追加的问题,遇到乘法运算也会报错。
解决方法
- 修改通用点击事件逻辑,排除等号按钮,不要把等号文本追加到表达式里
- 调用
eval之前,把表达式里的x替换为JS可识别的* - 可选优化:追加内容前增加合法性校验,避免重复追加运算符、小数点等异常情况
修正后的JS代码
let knopkes = document.querySelectorAll(`button`); let score = document.querySelector(`#score`) let equal = knopkes[15]; knopkes.forEach(el =>{ el.addEventListener(`click`,()=>{ // 排除等号按钮,不追加等号文本,同时去掉按钮文本自带的空格 if(el !== equal){ score.textContent += el.textContent.trim(); } }) }) equal.addEventListener(`click`,()=>{ // 把乘号x替换为JS识别的*后再执行计算 let expression = score.textContent.replace(/x/g, '*'); score.textContent = eval(expression); // 如果担心eval安全问题,也可以用你注释里的Function写法,效果一致: // score.textContent = new Function('return ' + expression)(); })
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

