我不知道为什么当我在事件侦听器中调用函数时更改函数内的操作变量时,它不会全局更改

i dont know why when i change my operation variable inside the function when called into the event listener it doesnt change globally

提问人:ahmed tahri 提问时间:11/8/2022 最后编辑:ahmed tahri 更新时间:11/8/2022 访问量:25

问:

我是 JavaScript 的新手,我想构建一个计算器,但是当我尝试更改事件侦听器中的全局变量时,变量仅在本地更改,但是当我需要链接到相等按钮的事件侦听器中的变量时,它会采用运算符的初始值,该值为空,因此我无法选择操作器并进行计算operatoroperator

let current_number = "";
let operator = "";
let previous = "";
let disp = document.querySelector("#current");
let prev = document.querySelector("#previous");
let equal = document.querySelector("#equal");

equal.addEventListener("click", calculate);

let number = document.querySelectorAll(".digit");
let oper = document.querySelectorAll(".operation");
number.forEach((element) => {
  element.addEventListener("click", function(e) {
    handleNumber(e.target.textContent);
    disp.textContent = current_number;
  });
});

oper.forEach((element) => {
  element.addEventListener("click", (e) => {
    handleOperator(e.target.textContent);
    prev.textContent = previous + " " + operator;
    disp.textContent = current_number;
  });
});

function handleNumber(num) {
  if (current_number.length < 10) {
    current_number += num;
  }
}

function handleOperator(op) {
  operator = op;
  previous = current_number;
  current_number = "";
}

function calculate() {
  previous = Number(previous);
  current_number = Number(current_number);
  if (operator === "+") {
    previous += current_number;
  } else if (operator === "-") {
    previous -= current_number;
  } else if (operator === "*") {
    previous *= current_number;
  } else {
    previous /= current_number;
  }
  console.log(previous);
}
* {
  box-sizing: border-box;
}
body {
  padding: 0;
  margin: 0;
  background: linear-gradient(to right, #2a92c7, #00ffc6);
}
#container {
  display: flex;
  justify-content: center;
  min-height: 100vh;
}
.btn {
  border: 1px solid white;
  border-radius: 0;
}
#main {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  justify-content: space-between;
  height: 100px;
}
#current {
  font-size: 2rem;
}
#display {
  background-color: rgba(13, 42, 6, 0.7);
}
.btn:hover {
  background-color: #9ea0a2;
}
.digit {
  font: 900;
}
<!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>Document</title>
    <link
      href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"
      rel="stylesheet"
      integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC"
      crossorigin="anonymous"
    />
    <link rel="stylesheet" href="styles.css" />
    <script src="script.js" defer></script>
  </head>
  <body>
    <div class="container-fluid">
      <div
        class="row text-light align-items-center justify-content-center"
        style="min-height: 100vh"
      >
        <div id="display" class="col-sm-5 col-xl-4">
          <div class="row">
            <div id="main" class="col-12 bg-gradient">
              <div id="previous" class="col"></div>
              <div id="current" class="col"></div>
            </div>
            <button class="col-6 btn btn-secondary shadow-none">AC</button>
            <button class="col-3 btn btn-secondary shadow-none">Del</button>
            <button class="operation col-3 btn btn-secondary shadow-none">
              /
            </button>
            <button class="digit col-3 btn btn-secondary shadow-none">1</button>
            <button class="digit col-3 btn btn-secondary shadow-none">2</button>
            <button class="digit col-3 btn btn-secondary shadow-none">3</button>
            <button class="col-3 btn btn-secondary shadow-none operation">
              *
            </button>
            <button class="digit col-3 btn btn-secondary shadow-none">4</button>
            <button class="digit col-3 btn btn-secondary shadow-none">5</button>
            <button class="digit col-3 btn btn-secondary shadow-none">6</button>
            <button class="col-3 btn btn-secondary shadow-none operation">
              -
            </button>
            <button class="digit col-3 btn btn-secondary shadow-none">7</button>
            <button class="digit col-3 btn btn-secondary shadow-none">8</button>
            <button class="digit col-3 btn btn-secondary shadow-none">9</button>
            <button class="col-3 btn btn-secondary shadow-none operation">
              +
            </button>
            <button
              id="dicim"
              class="digit col-3 btn btn-secondary shadow-none"
            >
              .
            </button>
            <button class="digit col-3 btn btn-secondary shadow-none">0</button>
            <button id="equal" class="col-6 btn btn-secondary shadow-none">
              =
            </button>
          </div>
        </div>
      </div>
    </div>
  </body>
</html>

JavaScript 范围 闭包 计算器

评论

0赞 Barmar 11/8/2022
欢迎来到 Stack Overflow!请发布一个最小的可重复示例。您可以使用堆栈代码段使其可执行。
0赞 Barmar 11/8/2022
我已将您的代码转换为堆栈代码段。请添加 HTML。
0赞 ahmed tahri 11/8/2022
我添加了我的 HTML
0赞 Barmar 11/8/2022
用于删除运算符周围的所有空格。e.target.textContent.trim()

答:

0赞 epascarello 11/8/2022 #1

如果你调试,你会看到发生了什么

function handleOperator(op) {
  console.log('handleOperator', operator, op);
  operator = op;

你会看到里面有一堆空格。op

修剪它

operator = op.trim();

或者更好的是使用数据属性

<button class="col-3 btn btn-secondary shadow-none operation" data-value="*">*</button>

并阅读它

handleOperator(e.currentTarget.dataset.value);

评论

0赞 ahmed tahri 11/8/2022
非常感谢你,我解决了我发现 pretier 在我的 vsocde 中添加空格的问题,当我按保存时