WedX - журнал о программировании и компьютерных науках

Странное (пусть) поведение при назначении переменных в узле repl - невозможно присвоить значения

Я использую Node v12.14.1 в Windows 10 в cmd.
При присвоении значения неопределенной функции переменной:

let a = f();

Я получил:

Thrown:
ReferenceError: f is not defined

Что хорошо. Но когда я пытаюсь:

a = 2;

Теперь я получаю:

Thrown:
ReferenceError: a is not defined

И когда я пытаюсь:

let a = 2;

Я получил:

Thrown:
SyntaxError: Identifier 'a' has already been declared

Таким образом, переменная, объявленная с помощью let, при присвоении значения неопределенной функции имеет уже объявленный идентификатор и в то же время не определена.
Это задумано? Я что-то упустил здесь? Является ли это ошибкой?
То же самое не происходит при использовании var в неопределенном назначении функции или когда ничего не используется (глобальная переменная).

12.05.2020

  • Вы не сумасшедший, и это не ошибка, но это точно странно. :) 12.05.2020

Ответы:


1

REPL забавны, но нет, такое поведение не является ошибкой, это действительно соответствует спецификации. Однако это то, чего вы не могли увидеть в среде, отличной от REPL.

Оператор let создает привязку¹ при входе в область, где появляется let, но не инициализирует ее (в отличие от var, который инициализирует ее undefined). (В случае REPL «вход в область» в основном происходит непосредственно перед выполнением кода, который вы ему дали.) Инициализация происходит, когда происходит часть инициализации оператора let, позже, когда вы достигаете этого оператора на шаге — пошаговое выполнение.² Однако в вашем коде вы никогда не дойдете до этой части оператора, потому что при оценке инициализатора он выдал ошибку.

В этот момент вы ничего не можете сделать с a, потому что он существует, но не инициализирован, и единственное, что могло инициализировать его (результат инициализатора в исходном let a = f();), не удалось и не может быть запущен снова.

Причина, по которой вы не видите этого в коде, отличном от REPL, заключается в том, что ошибка выведет вас за пределы области, в которой a был создан, но не инициализирован. рассмотреть возможность:

try {
    let a = f(); // ReferenceError
    // Execution in this block never continues
} catch {
    // Execution arrives here...but `a` is not in scope
}

¹ binding — запись для переменной в записи среды контекста выполнения

² Если оператор let не имеет инициализатора, на этом этапе используется undefined.

12.05.2020
  • FWIW, я расскажу о привязках и о том, как работают объявления нового стиля (let, const и class) в главе 2 моей новой книги, которая выйдет через пару месяцев. Ссылки в моем профиле, если интересно. 12.05.2020
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]