我在 cmd 中在 Windows 10 上使用 Node v12.14.1。
将未定义函数的值分配给变量时:
let a = f();
我得到:
Thrown:
ReferenceError: f is not defined
这很好。但是当我尝试时:
a = 2;
我现在得到:
Thrown:
ReferenceError: a is not defined
当我尝试时:
let a = 2;
我得到:
Thrown:
SyntaxError: Identifier 'a' has already been declared
因此,使用 let 声明的变量,在分配未定义函数的值时,其标识符已经声明,但同时未定义。
这是故意的吗?我在这里错过了什么吗?这是一个错误吗?
在未定义的函数赋值中使用 var 或不使用任何东西(全局变量)时,不会发生同样的情况。
最佳答案
REPL 很有趣,但不,这种行为不是错误,它确实符合规范。但是,这是您在非 REPL 环境中看不到的东西。
一个 let
语句在进入 let
的范围时创建一个绑定(bind)¹出现,但不初始化它(不像 var
,它用 undefined
初始化它)。 (在 REPL 的情况下,“进入范围”基本上是在它执行你给它的代码之前。)初始化发生在 let
的初始化部分时。语句发生,稍后当您在逐步执行中到达该语句时。² 但是,在您的代码中,您永远不会到达语句的该部分,因为在评估初始化程序时,它会引发错误。
到那时,a
将无能为力。 ,因为它存在但未初始化,并且唯一可以初始化它的东西(原始 let a = f();
中的初始化程序的结果)失败并且无法再次运行。
您在非 REPL 代码中看不到的原因是该错误会使您超出 a
的范围。已创建但未初始化。考虑:
try {
let a = f(); // ReferenceError
// Execution in this block never continues
} catch {
// Execution arrives here...but `a` is not in scope
}
¹ 绑定(bind) - 执行上下文的 environment record 中的变量条目
² 如果
let
语句没有初始化器,undefined
此时使用。
关于javascript - Node repl 中奇怪的(让)变量赋值行为 - 无法赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61756636/