我有一个带有以下JavaScript的HTML页面。
alert(box);
box = "Thinking outside the box";
在控制台中,我收到“ Uncaught ReferenceError:框未定义”
当我将其更改为:
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 reference error
。
在SO上有许多描述起重细节的帖子。您可以在此处查看其中的一长串列表:https : //stackoverflow.com/search?q= javascript+variable+hoisting,在这里您可以找到有关变量提升的更多说明。
注意:函数声明也被悬挂,因此您发现的一些帖子将是关于函数声明而不是变量声明的,尽管概念几乎是相同的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句