无法在函数内访问全局变量 (Javascript)

Can't access global variables inside a function (Javascript)

我写了一个简单的BMI计算器,但是我好像无法访问函数内部的全局变量。如果 weight 只是一个数字,一切都很好——但是当我想用 Javascript 获取这个元素时,它不起作用。当这些变量在函数内部时,一切都很好。我知道,提升,范围..但是为什么带有数字的变量可以工作呢?

代码如下:

const height = parseInt(document.querySelector("#height").value);
const weight = parseInt(document.querySelector("#weight").value);

const results = document.querySelector("#results");

function bmiCalc() {
  if (height === "" || isNaN(height))
    results.innerHTML = "Invalid Height! Please use numbers";
  else if (weight === "" || isNaN(weight))
    results.innerHTML = "Invalid Weight! Please use numbers";
  else {
    const bmi = (weight / ((height * height) / 10000)).toFixed();
    results.innerHTML = bmi;
  }
}

const button = document.querySelector(".results__btn");

button.addEventListener("click", bmiCalc);

那是因为您在用户输入任何内容之前获取值,因为一旦脚本启动就会获取输入数据 运行

如果您想在全局范围内声明它,则需要在每次输入更改时放置一个侦听器以从中获取实际值。如果将身高和体重放入 bmiCalc() 中,它会起作用,因为该函数仅在按下按钮时被调用,因此它从输入中获取实际值(按下按钮时的当前值)。

原因是,当页面加载时,您的全局变量将在输入任何内容之前读取输入。全局变量在页面加载时创建,在 window 关闭时删除。在您的代码中,正在创建全局变量 weight 和 height 并使用这两个输入(为空)为它们分配一个值。因此,当您单击该按钮时,体重和身高变量的值为“”。它不会显示评估结果,而是会显示错误消息。另一方面,当您将变量放入函数中时,除非您执行函数(在本例中为 bmiCalc 函数),否则不会创建变量。它是这样工作的:

  1. 按钮被点击
  2. 变量已创建。
  3. 该函数计算输入。
  4. 条件满足时显示结果
  5. 活动结束
  6. 变量被删除。

而且,同样的过程一遍又一遍地发生。

这仅仅是因为 heightweight 的值是在页面完成加载时设置的,甚至在 bmiCalc 函数定义、绑定和 运行。由于您希望在单击计算按钮时提取新值,因此您需要具有读取 bmiCalc 函数内字段的代码,否则,您将只能获得启动时的值。因此,可以访问变量,但它们是空的,因为没有任何内容可读。

如果你想在函数外定义元素getter,你可以这样重写:


const heightInput = document.querySelector("#height");
const weightInput = document.querySelector("#weight");
const results = document.querySelector("#results");

function bmiCalc() {
  const height = parseInt(heightInput.value);
  const weight = parseInt(weightInput.value);
  if (height === "" || isNaN(height))
    results.innerHTML = "Invalid Height! Please use numbers";
  else if (weight === "" || isNaN(weight))
    results.innerHTML = "Invalid Weight! Please use numbers";
  else {
    const bmi = (weight / ((height * height) / 10000)).toFixed();
    results.innerHTML = bmi;
  }
}

const button = document.querySelector(".results__btn");

button.addEventListener("click", bmiCalc);

它的不同之处在于它在函数外部绑定输入元素,但随后在函数调用时实际读取并解析它们的内容。