javascript - JavaScript 行之间保持什么状态?

标签 javascript node.js ecmascript-6 babeljs

我想知道提交给 babel-node 的两行 JavaScript 代码之间保留了什么状态。我之所以感到困惑,是因为如果您编写两行代码,就可以无错误地覆盖变量定义。例如,使用 babel-node --presets es2015,你可以:

> const a = 1;
undefined
> let a = 2;
undefined

现在如果你把它写在一行中,你会得到一个错误:

> const a = 1; let a = 2;
TypeError: repl: Duplicate declaration "a"
...

似乎在第一种情况下,a被定义为1(const变量赋值)的状态丢失了(但还没有直到第二次赋值),而在第二种情况下,它被维护。

是什么导致了这里的差异?以及维持哪些状态?

最佳答案

因为 constlet 是新的语法,它们必须被转译为 ES6 之前唯一可用的绑定(bind)机制:var。在这种情况下,var 允许进行各种随意的重新分配,而不会产生任何类型的警告。

因此,当您在 babel-node 中键入一个表达式时,babel 会对其进行转换、计算,然后显示结果。 Babel 可以在编译时检查是否滥用了 const 绑定(bind),这就是为什么您会看到 const a = 1; 错误的原因。让 a = 2。但是 const a = 1let a = 2,当作为单独的表达式进行转译/求值时,不会出现错误,因为 babel 无法检测到任何一个表达式中的问题一个人。


问题的更直观的演示:对于您在 babel-node REPL 中键入的每个表达式 expr,这基本上就是正在发生的事情

evaluate(transpile(expr))
// => someResult

所以你不会在这里看到错误

evaluate(transpile('const a = 1'))
evaluate('var a = 1')
// bind a to 1
// return undefined

evaluate(transpile('let a = 2'))
evaluate('var a = 2')
// bind a to 2
// return undefined

但是你会在这里看到一个错误

evaluate(transpile('const a = 1; let a = 2'))
// ERROR during transpile: const a has already been declared

关于javascript - JavaScript 行之间保持什么状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44275202/

相关文章:

javascript - 仅当定义了值时才向对象添加属性

javascript - 修改类名后节点引用丢失

javascript - JQuery URL 事件监听器

javascript - jquery : Setting value in hidden input upon onchange event

node.js - AWS 中的 Lambda 开发 -?本地开发?或使用 AWS Web 控制台

node.js - 在 Ruby 中从 aws-kms 解密 key

javascript - 控制字符的 Socket.IO 问题

javascript - Jquery:在下拉菜单选择上调用函数。

javascript - whatwg 的 Loader 规范、动态导入建议和 <script type ='module' > 之间有什么关系?

javascript - 使用 map 仅更新 javascript 对象中的单个键