在node.js中评估“()”会导致更奇怪的行为,但浏览器表示语法错误(node.js中的错误?)

当我在node.js(不带引号)中评估expression式“()”时,会破坏环境。 全局对象被丢弃,没有任何工作。 当我在浏览器控制台中评估相同的expression时,它会报告语法错误。 从我的研究看来,浏览器是正确的。 这是在node.jsexpression式分析器的错误? 任何人都可以解释底下发生了什么? 这是一个截图

()本身是无效的JavaScript语法。

当节点在REPL中遇到语法错误时,它等待更多的input。 它试图通过改变你的提示三点来表明这一点。

这很有用,因为有时你想input一些包含新行的代码:

 > () => { // this isn't valid syntax by itself ... } // but you can complete a valid expression like this 

在这种情况下,没有可以添加的input来完成有效的expression式,但是可以使用ctrl-c退出“等待input”模式。

想象一下,你正在编写你自己的JavaScript REPL。 你知道JavaScript的语法,你想尽快中止处理无效的input(但不是在此之前)。 所以,你决定逐个字符地读取字符,通过标记build立标记,并在你遇到不可能的标记(对于当前状态,到目前为止处理的input定义的状态)立即中止。

所以,你知道用户input(} ,放弃是相当安全的 – 没有办法有意义的事情会出来!

另外,如果用户input(2 ,你不想中止 – 有很多有效的字符可以跟随)* ,等。

()之后你也知道该期待什么。 如果不是=>... (lambdaexpression式),那它就是无效的标记。

现在回到现实。 Node.js,Chrome,Firefox等中的REPL实现有所不同,因为它们可以。 有些人比其他人“聪明”,会比其他人更快地stream产,但这确实取决于他们。

Node.jsselect了“不太聪明”的REPL,因为它不会中止读取你的input。 事实上,如果你input的东西永远无法形成一个有效的expression式,它会让你挂起,阅读垃圾,直到你用Ctrl+C显式中止。

Chrome的控制台有点智能。 当你input() ,你会得到:

 > () Uncaught SyntaxError: Unexpected token ) 

但是,当你开始input一个lambda ()=> ,它将允许你在下一行完成它:

 > ()=> 2 

作为一个安慰的话,如果你指出你已经完成了input你的expression式,你将会在Node.js REPL中得到同样的错误,如下所示:

 > eval("()") SyntaxError: Unexpected token ) 

这只是当Node无法parsing您input的expression式时发生的情况,并且正在等待更多input以查看是否可以完成parsing。 试试像((( )等其他的废话,你会得到相同的结果,你可以使用Ctrl-C中止parsing,并返回到工作提示。