JavaScript 变量未定义与未定义

标签 javascript variables alert variable-assignment

我有一个附加了以下 JavaScript 的 HTML 页面。

alert(box);
box = "Thinking outside the box";

在控制台中我得到“Uncaught ReferenceError: box is not defined”

当我把它改成:

alert(box);
var box = "Thinking outside the box";

警报被调用并显示未定义。我需要能够解释这一点,我对为什么会这样有一个模糊的想法。我知道当我使用 var 时,JavaScript 知道在执行警报之前变量就在那里,但不一定给它赋值??我离开这里了吗?需要一些帮助来理解这一点。

最佳答案

当您使用 var 定义变量时,变量的声明被“提升”到作用域的顶部,因此该变量是为整个作用域定义的。变量的初始化(为其分配初始值)保留在代码中的相同位置。

因此,在您的第二个示例中,当您执行 alert(box) 时,变量 box 已被声明,因为已提升 var 声明。你的第二个例子:

alert(box);
var box = "Thinking outside the box";

基本上等同于此(box 变量的声明被提升到范围的顶部):

var box;
alert(box);
box = "Thinking outside the box";

这使得 box 变量在您的 alert(box) 语句之前声明(尽管未初始化),因此您得到的结果与声明的变量一致,但还没有值(alert() 报告 undefined,这是变量存在但尚未初始化时发生的情况)。

您的第一个示例不使用 var,因此没有提升,所以在您执行 alert(box) 时,根本没有名为 box,因此您会得到 Uncaught ReferenceError

SO这里有很多很多帖子描述了吊装的细节。你可以在这里看到一长串:https://stackoverflow.com/search?q=javascript+variable+hoisting您可以在其中找到变量提升的进一步说明。

注意:函数声明也被提升,因此您找到的一些帖子将是关于函数声明而不是变量声明,尽管概念几乎相同。

关于JavaScript 变量未定义与未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24502643/

相关文章:

c - fpga(14 位)vhdl 模块与 NIos II 系统(16 位)之间的数据传输

c++ - 为什么将有符号值分配给无符号整数时编译器不给出错误? - C++

flutter - Flutter/Dart:无法调用窗口小部件方法

android - 更新通知振动/铃声

javascript - 相当于 JavaScript 中 Lodash 的 .maxBy

javascript - 如何从 javascript 调用 angularjs 函数?

java - 如何通过 Java 接口(interface) promise 数据结构?

带有转义字符的 JavaScript 警报失败

javascript - React Redux 忽略调度

javascript - 在加载时编辑表值