Фрагменты фрагментов Google Chrome: идентификатор '' уже объявлен

Я использую сниппеты Google Chrome (внутри Dev Tools) для разработки и тестирования JS.

При объявлении классов ES6 консоль выдает

Uncaught SyntaxError: идентификатор "Foo" уже объявлен в...

после первого запуска.

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 Foo {
    constructor(val) {
            this.bar = 'MyHardcodedVal'; // Here is the changed code
        }
    }
}

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

Как видите, изменения, которые я внес в свой класс, не вступают в силу.

Похоже, что Google Chrome поместил мой код в песочницу, недоступную для редактирования.

Способ заглянуть за кулисы и увидеть, что делает Google Chrome, — это ввести преднамеренную ошибку в код, а затем нажать на источник ошибки, который Chrome показывает в консоли. Там вы увидите, что код для класса все еще старый и не изменился вообще, а код, который был вне области действия блока, актуален.

«Выделено

«Здесь

Я всегда могу закрыть вкладку, в которой работаю, и снова открыть ее, но это нецелесообразно.

Что я делаю не так?

Есть ли разумный способ использовать сниппеты для таких тестов?

Надеюсь, это имеет смысл!


person kev    schedule 21.04.2019    source источник
comment
Неясно, что на самом деле произошло, поскольку у меня всегда работает то же самое, когда я использую {}-обернутый код. Кстати, {} — это фигурные скобки, а не кавычки, и ваш второй фрагмент не заключен в оболочку. Я думаю, что вопрос неполный. Пока это звучит так, как будто ваша первая неверная попытка все еще находится в глобальном контексте, и вы думали, что она волшебным образом исчезнет, ​​чего, конечно же, не произойдет.   -  person wOxxOm    schedule 22.04.2019
comment
Эй, @wOxxOm, извини, я думал, что это понятно, но ты прав, это было не так. Я должен был потратить больше времени на полное объяснение ситуации. Пожалуйста, взгляните сейчас и посмотрите, сможете ли вы воспроизвести поведение, с которым я сталкиваюсь. Спасибо!   -  person kev    schedule 22.04.2019
comment
вы не можете повторно объявить let, const и class. Объявление с тем же именем вызовет ту ошибку, которую вы видите. Если вы не объявили его раньше, то он должен был быть объявлен где-то в вашем глобальном коде. Очистка консоли не очищает память объявлений.   -  person yqlim    schedule 22.04.2019
comment
Все должно быть заключено в {}, а не только объявление класса, и вам нужно использовать const/let внутри, а не var. Код вне блока использует внешнюю (глобальную) область видимости. Вот как работает JavaScript.   -  person wOxxOm    schedule 22.04.2019
comment
Спасибо, @wOxxOm. Помещение всего в блочные кавычки сработало как шарм.   -  person kev    schedule 22.04.2019


Ответы (1)


Судя по комментариям, решение состоит в том, чтобы обернуть весь сниппет в фигурных скобках.

{
  class Foo {
    constructor(val) {
      this.bar = 'MyHardcodedVal'; // Here is the changed code
    }
  }
  var f = new Foo('myVal');
  console.log(f.bar); // STILL prints 'myVal'
}
person Kayce Basques    schedule 24.04.2019
comment
Да, это правильно. Спасибо, что нашли время. - person kev; 29.04.2019