为什么这个代码段在节点repl中不起作用?

时间:2017-04-21 09:08:08

标签: javascript node.js

我刚开始玩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)中工作?

1 个答案:

答案 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;
}

图片:

enter image description here

这很有效。问题可能在于节点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中发现了一个错误。

相关问题