Node的REPL不能识别块代码

3
我正在尝试在Node的REPL中编写简单的代码,但遇到了一些困难:
逐行输入命令时一切正常, 但当用括号块{ ... code ... }包装它时 (每行后按Enter键) 在结束符(})后出现错误。

enter image description here

正如您在我添加的图片中所看到的那样 - 逐行执行相同的代码是可以正常工作的。

提示:{}是一个对象字面量请仅返回翻译后的文本内容,不要进行解释。 - nem035
Node v5甚至无法关闭该块,因此您的旧版本更接近!您为什么要这样做呢?我怀疑REPL不会执行任意代码块,像那样。 - Matt Styles
谢谢@nem,但我想写一个代码块(通过REPL测试js而不是单行)。 - GrizzlyMcBear
@MattStyles - 不知道Node v5(但如果有时间会研究一下),原因已经写在上面了,幸运的是 - 我们可以做到 :) - GrizzlyMcBear
额外/结束的分号在Node v5中也可以使用!多行代码离我而去!我通常只执行一个小文件,但我可以看到多行代码是有用的。 - Matt Styles
2个回答

2

您的解释器认为您将要创建一个对象字面量,例如{ var: x }{ var x; }不是一个好的对象语法,因为标识符var后面应该有一个冒号,而不是x。 因此,会出现SyntaxError

您可以通过在任何提示之前添加强制解析器认为它实际上是代码块来实现:

label: { var x; }

if (true) { var x; }

do { var x; } while (false);

编辑:还要注意的是,没有充分的理由去这样做。如果你不是将代码块用作流程控制语句的语句组或标签的目标,则它是完全无用的(并且可能会成为难以跟踪的bug源,就像你发现的那样)。

在其他编程语言中,您可能正在控制变量的作用域(我想您希望确保x在代码块之外不可见?)。然而,在JavaScript中,只有函数拥有作用域。因此,要将变量与周围环境隔离开来,需要使用一个函数:

{
  var x1;
};
x1; // undefined

(function() {
  var x2;
})();
x2; // Uncaught ReferenceError: x is not defined

1
我明白了,我应该在括号后面加上一个 ;

现在运行代码的结果如下:

enter image description here


自 Node 10.9 起,这将无法工作。请参阅 https://dev59.com/x14b5IYBdhLWcg3wZwu3#52986981 - Estus Flask

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接