计算器开发问题:console.log变量正常但return无返回值
问题解决:计算器数字变量无法正确返回更新值
问题核心
我正在给计算器添加两个功能:
- 点击数字按钮时,数字显示在GUI的输出框中
- 把点击的数字累加进变量
num
目前第一点已实现,代码如下:
outputBox.textContent += e.target.classList[1]
但第二点出现问题:在getNumber函数里,console.log(num)能正确输出累加后的数字,但函数return num后,外部拿不到更新后的值——点击等于按钮时,控制台输出的还是初始的空字符串。
代码片段
HTML
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Calculator</title> <link rel="stylesheet" href="styles.css"> </head> <body> <div class="calcContainer"> <div id="outputBox"> </div> <div class="buttons"> <button class="number 7">7</button> <button class="number 8">8</button> <button class="number 9">9</button> <button class="operator ÷">÷</button> <button class="number 4">4</button> <button class="number 5">5</button> <button class="number 6">6</button> <button class="operator x">x</button> <button class="number 1">1</button> <button class="number 2">2</button> <button class="number 3">3</button> <button class="operator -">-</button> <button class="number 0">0</button> <button id="clear">AC</button> <button id="equals">=</button> <button class="operator +">+</button> </div> </div> <script src="script.js"></script> </body> </html>
JavaScript
let outputBox = document.getElementById("outputBox"); const number = document.getElementsByClassName("number"); const operator = document.getElementsByClassName("operator"); const equalsButton = document.getElementById("equals") let a = "", middle = "", b = "", runningTotal = 0 function getNumber(num) { for (let i = 0; i < number.length; i++) { number[i].addEventListener("click", (e) => { outputBox.textContent += e.target.classList[1] num += e.target.classList[1] console.log(num) }) } return num } a = getNumber(a) function equals(abc) { equalsButton.addEventListener("click", () => { console.log(abc) }) } equals(a)
问题原因
事件监听器是异步触发的:getNumber函数执行时,只是给按钮绑定了点击事件,然后立刻返回了初始的空字符串num(也就是初始的a)。后续点击按钮时,虽然修改了监听器内部的num变量,但这个变量和外部的a已经没有关联——因为字符串是值类型,传递的是副本而非引用。
解决方案
以下是几种简单有效的修复方式:
方案1:直接操作全局变量a
把getNumber里的num替换成全局的a,点击按钮时直接更新全局变量,equals函数可直接读取最新值:
function getNumber() { for (let i = 0; i < number.length; i++) { number[i].addEventListener("click", (e) => { outputBox.textContent += e.target.classList[1] a += e.target.classList[1] console.log(a) }) } } getNumber() function equals() { equalsButton.addEventListener("click", () => { console.log(a) }) } equals()
方案2:在equals函数中直接读取输出框内容
既然输出框已同步显示点击的数字,可直接从outputBox.textContent获取当前值,无需额外维护变量:
function getNumber() { for (let i = 0; i < number.length; i++) { number[i].addEventListener("click", (e) => { outputBox.textContent += e.target.classList[1] }) } } getNumber() function equals() { equalsButton.addEventListener("click", () => { console.log(outputBox.textContent) }) } equals()
方案3:用闭包维护状态
若不想使用全局变量,可通过闭包封装状态,确保变量更新能被外部访问:
function createNumberHandler() { let num = "" for (let i = 0; i < number.length; i++) { number[i].addEventListener("click", (e) => { outputBox.textContent += e.target.classList[1] num += e.target.classList[1] console.log(num) }) } // 返回获取当前值的方法 return () => num } const getCurrentNum = createNumberHandler() function equals() { equalsButton.addEventListener("click", () => { console.log(getCurrentNum()) }) } equals()
内容的提问来源于stack exchange,提问作者Kenneth
相关产品推荐
相关产品推荐

