Google Chrome 片段:标识符“...”已声明

Google Chrome Snippets: Identifier '...' has already been declared

我正在使用 Google Chrome 的代码段(在开发工具中)进行一些 JS 开发和测试。

当声明 ES6 classes 时,控制台抛出一个

Uncaught SyntaxError: Identifier 'Foo' has already been declared at...

第一次之后是 运行。

class Foo {
constructor(val) {
        this.bar = val;
    }
}

var f = new Foo('myVal');
console.log(f.bar); // prints 'myVal'

我做了一些研究,发现用 {} 将代码包装在块范围内有助于避免这个问题。

但是当我这样做时,虽然代码 运行 没有错误,但 Chrome 无法识别我可能对我的代码所做的任何后续编辑。

因此,如果我将上面的代码更改为以下代码:

{
    class Foo {
    constructor(val) {
            this.bar = val;
        }
    }
}

var f = new Foo('myVal');
console.log(f.bar); // prints 'myVal'

到目前为止一切正常。

现在,我意识到我的 class 有问题,我将代码更改为以下内容:

{
    class Foo {
    constructor(val) {
            this.bar = 'MyHardcodedVal'; // Here is the changed code
        }
    }
}

var f = new Foo('myVal');
console.log(f.bar); // STILL prints 'myVal'

如您所见,我对 class 所做的编辑没有生效。

看来 Google Chrome 已将我的代码放入沙箱中,不受我的编辑影响。

一种查看幕后情况并查看 Google Chrome 正在做什么的方法是在代码中引入一个故意的错误,然后单击错误的来源 Chrome 显示在控制台中。在那里你会看到 class 的代码仍然是旧的,根本没有改变,而块范围之外的代码是最新的。

我总是可以关闭我正在使用的选项卡并再次打开它,但这不切实际。

我做错了什么?

有没有一种合理的方法可以使用代码段进行此类测试?

希望这是有道理的!

根据评论,听起来解决方案是将整个 snippet 括在大括号中。

{
  class Foo {
    constructor(val) {
      this.bar = 'MyHardcodedVal'; // Here is the changed code
    }
  }
  var f = new Foo('myVal');
  console.log(f.bar); // STILL prints 'myVal'
}