javascript - Node repl 中奇怪的(让)变量赋值行为 - 无法赋值

标签 javascript node.js

我在 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/

相关文章:

javascript - 你怎么知道一个函数在 node.js 中是异步的还是同步的?

javascript - 如何使用 Angular 6从纬度和经度获取地址

node.js - 如何修复 "Error: listen EADDRINUSE: address already in use:::5000"未处理的 'error' 事件

node.js - "dispatch()"是什么意思/做什么,为什么当我们有 .then() 和 .catch() 时使用它

javascript - 在内容可编辑元素中设置插入符号位置

javascript - 有什么方法可以用数组索引替换哈希表中的键吗?

javascript - 处理嵌套表单中的许多隐藏字段

angularjs - Kibana 未加载样式表

node.js - Graphicsmagick 无法在带有 nodejs 和 S3 的 Elastic Beanstalk 中工作

javascript - 如何构建 JSON 调用