javascript - "nonexistent variable"是否在非严格代码中计算为 "undefined"值?

标签 javascript reference theory

此段出自书JavaScript: The Definitive Guide, 6th edition , 第 58 页:

When any identifier appears by itself in a program, JavaScript assumes it is a variable and looks up its value. If no variable with that name exists, the expression evaluates to the undefined value. In the strict mode of ECMAScript 5, however, an attempt to evaluate a nonexistent variable throws a ReferenceError instead.


首先,让我解释一下我是如何解释该段落中使用的一些短语的。

...标识符在程序中单独出现,...”:

我假设作者的意思是标识符被解析为表达式的情况(在这种情况下执行标识符解析)。例如:

function func ( arg ) {
    var local = helper( arg );
} 

这里的funcarg(出现了两次)、localhelper都是标识符,但是只有 helperarg(仅在其第二次出现!)是表达式。因此,只有这两个标识符会导致引用错误。

...不存在具有该名称的变量...”和“不存在的变量”:

我假设,作者是指一个评估为无法解析的引用的标识符。


现在,如果我错了,请纠正我,但是...

当解析为表达式(准确地说是 PrimaryExpression)的标识符被求值时,将执行标识符解析。此过程的结果始终是 Reference 类型的值。换句话说,标识符将计算为一个引用。

引用有一个基值和一个引用名称。引用的名称是标识符的文本,基值是具有该名称绑定(bind)的环境记录(包含此类变量的范围)。但是,如果标识符解析无法解析引用的名称,则引用的基值将为 undefined 值。

因此,一个“不存在的变量”计算为一个基值为undefined 的引用。

注意一个不存在的变量的计算如何不会抛出引用错误。当解释器检索引用的值时(通过 GetValue())稍后会抛出错误。然而,这可能并不总是发生 - 例如,如果 x 评估为无法解析的引用,则 typeof x 将不会检索引用的值,因此,引用不会抛出错误。


我的问题开头引用的段落指出,在非严格代码中,不存在的变量求值为 undefined,而在严格代码中,此类标识符的求值会引发引用错误。我相信这两个陈述都是不正确的 - 一个不存在的变量评估为基值为 undefined 的引用,并且在严格模式下不会抛出引用错误。

当解释器试图检索此类引用的值时(这可能发生也可能不发生取决于标识符出现在其中的“外部”表达式或语句),引用错误抛出。此行为在非严格模式和严格模式之间没有不同。


那么,该段落是否正确?如果不正确,我是否正确识别了错误? (另外,如果我的文中有错误,请指正。)

最佳答案

在非严格代码中,“不存在的变量”是否计算为“未定义”值?

> foo;
ReferenceError: foo is not defined
> var x = foo;
ReferenceError: foo is not defined

这种行为在严格模式下也是正确的:

> (function () { "use strict"; foo; }());
ReferenceError: foo is not defined
> (function () { "use strict"; var x = foo; }());
ReferenceError: foo is not defined

我所知道的严格模式和非严格模式在变量解析方面的唯一区别是,当赋值一个变量时,如果变量没有声明,严格模式会抛出一个ReferenceError模式,但是在非严格模式下,会隐式创建一个全局变量。

Annex C (The strict mode of ECMAScript):

Assignment to an undeclared identifier or otherwise unresolvable reference does not create a property in the global object. When a simple assignment occurs within strict mode code, its LeftHandSide must not evaluate to an unresolvable Reference. If it does a ReferenceError exception is thrown (8.7.2).

关于javascript - "nonexistent variable"是否在非严格代码中计算为 "undefined"值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754801/

相关文章:

algorithm - 空算法的时间复杂度是O(0)吗?

vba - 两个范围之间的差异

javascript - touchswipe 在同一元素上滑动并单击功能

c 使用静态变量查找数字的倍数?

variables - 将 "mut"放在变量名之前和 ":"之后有什么区别?

python - 如何复制字典并仅编辑副本

compiler-construction - 编译器如何管理它们的内存占用?

javascript - 需要滑出按钮才能单独工作。当单击一个按钮时,两者都会执行任务。

javascript - Angularjs - 使用 $scope 值加载 JSON 数据(动态)返回未定义

javascript - Controller 未定义 AngularJS