您看到此类问题的原因是控制台本身试图模拟您当前定位的上下文的全局范围。它还尝试从您在控制台中编写的语句和表达式中捕获返回值,以便显示为结果。举个例子:
> 3 + 2
< 5
在这里,它就像一个表达式一样执行,但是您已经将它写成一个语句。在普通脚本中,该值会被丢弃,但在这里,代码必须在内部被破坏(例如用函数上下文和语句包装整个return
语句),这会导致各种奇怪的效果,包括您遇到的问题。
这也是为什么脚本中的一些裸 ES6 代码可以正常工作但在 Chrome 开发工具控制台中不能正常工作的原因之一。
尝试在 Node 和 Chrome 控制台中执行此操作:
{ let a = 3 }
在 Node 或<script>
标签中它工作得很好,但在控制台中,它给出了Uncaught SyntaxError: Unexpected identifier
. 它还为您提供了指向源的链接VMxxx:1
,您可以单击该链接来检查评估的源,该链接显示为:
({ let a = 3 })
那么它为什么这样做呢?
答案是它需要将你的代码转换为表达式,以便将结果返回给调用者并显示在控制台中。您可以通过将语句括在括号中来做到这一点,这使它成为一个表达式,但它也使上面的块在语法上不正确(表达式不能有块声明)。
控制台确实试图通过对代码的聪明来解决这些边缘情况,但这超出了这个答案的范围,我认为。您可以提交错误以查看他们是否会考虑修复。
这是一个非常相似的好例子:
https://stackoverflow.com/a/28431346/46588
使您的代码工作的最安全方法是确保它可以作为表达式运行并检查SyntaxError
源链接以查看实际执行代码是什么,并从中逆向工程解决方案。通常它意味着一对战略性放置的括号。
简而言之:控制台尝试尽可能准确地模拟全局执行上下文,但由于与 v8 引擎和 JavaScript 语义交互的限制,这有时很难或不可能解决。