我刚开始玩ES6和Node,在节点repl中尝试新功能:
{
const str = 'Alice';
let arr = [];
for (let c of str) {
arr.push(c);
}
arr;
}
抛出错误:
const str = 'Alice';
^^^
SyntaxError: Unexpected identifier
arr;
ReferenceError: arr is not defined
我无法弄清楚我做错了什么(想想阻止声明可能不会这样做),所以我转向Chrome控制台进行确认。该片段工作正常。那么为什么它不能在节点repl(v7.8.0)中工作?
答案 0 :(得分:3)
呃,问题是你如何在{...}
中定义代码。它应该按预期工作,因为你已经说过它可以在chrome的开发控制台中运行。 (请注意,你所做的是对destructuring assignment的一些不寻常的使用,但是......知道它为什么不能在repl中工作是一件好事!)< / p>
显然,当您使用结束大括号}
时,repl会停止创建,从而执行{
和}
中定义的内容。让我们在repl中逐步添加您的代码,当您添加for循环的}
时会出现错误:
> {
... const str = 'Alice';
... let arr = [];
... for (let c of str) {
..... arr.push(c);
..... }
const str = 'Alice';
^^^
SyntaxError: Unexpected identifier
所以解析器收到的代码是
{
const str = 'Alice';
let arr = [];
for (let c of str) {
arr.push(c);
}
这当然不正确。如果你重新编写代码,在范围内没有结尾}
,那么它的工作原理!试试这段代码
{
const str = 'Alice';
let arr = [];
for (let c of str) arr.push(c);
arr;
}
图片:
这很有效。问题可能在于节点repl如何处理{}内容。
我很感兴趣,所以请进一步检查。问题是,在放置}
字符后按下后,repl会开始评估您的语句。我检查了这个,如果你做了以下事情:
{
const a = 'Alice';
let arr = [];
for (let c of a) {
arr.push(c);
} arr; }
请注意在一行中使用两个}
。你会得到答案;
> {
... const a = 'Alice';
... let arr = [];
... for (let c of a) {
..... arr.push(c);
..... } arr; }
[ 'A', 'l', 'i', 'c', 'e' ]
祝贺。您在节点repl中发现了一个错误。