为什么这个片段不能在节点repl中工作?

我刚开始玩ES6和Node,在节点repl中尝试新的function:

{ 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)?

呃,问题是你如何在{...}定义你的代码。 它应该像预期的那样工作,正如你所说的那样,它在Chrome的开发控制台中工作。 ( 注意,你所做的是对解构赋值有一些不寻常的使用,但是知道它为什么不能在repl中工作是一件很好的事情!

当你使用结束大括号时,显然repl停止创build,从而执行{}定义的内容。 让我们在repl中一步一步地添加你的代码,当你添加for循环的时候你会得到一个错误:

 > { ... const str = 'Alice'; ... let arr = []; ... for (let c of str) { ..... arr.push(c); ..... } const str = 'Alice'; ^^^ SyntaxError: Unexpected identifier 

所以parsing器收到的代码是

 { 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如何处理{}内容。

UPDATE

我很好奇,所以进一步检查。 问题是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中的一个bug。