在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,并返回到工作提示。