为什么这个片段不能在节点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。