Внизу у меня есть две приятные и простые строки кода. Но я могу гарантировать вам, что это либо сильно смутит вас (поскольку вы проигнорировали принцип подчеркивания JS), либо утешит вас.
Но он полностью загрузил концепции знаний, как показано ниже
Мое противоречивое заявление
как и var, const и let также поднимают свои свойства, но они находятся в другой зоне.
поднятие Def (простая версия для непрофессионалов)
Теперь пришло время углубиться в то, как Js компилирует и выполняет наш двухстрочный код
В JavaScript способ обработки объявлений и присвоений переменных компилятором и движком может быть детализирован, особенно при работе с let и var.
Давайте разберем процесс с точки зрения компилятора и выполнения данного кода:
name = 'ashu'; let name;
На этом этапе я поясняю, что когда мы пишем код JavaScript, первый парсер и компилятор компилирует наш код, а затем он переходит в фазу выполнения.
Перспектива компилятора
Первая строка: name = 'ashu';
На этапе компиляции,
движок JavaScript анализирует код и создает необходимые области действия.
Имя назначения = 'ашу';
будет отмечено, но на этом этапе движок не выполняет код; он просто записывает существование присвоения переменной с именем name.
Если имя не было объявлено ранее, компилятор рассматривает его как присвоение глобальной переменной (имя var в глобальной области видимости), поскольку объявления var поднимаются и доступны глобально.
Вторая строка: let name;
Когда компилятор встречает имя let; декларация, он подтверждает, что name должно иметь область действия блока.
Компилятор помещает имя во временную мертвую зону (TDZ) для области, к которой оно принадлежит,
это означает, что подтверждает существование имени, но помечает его как неинициализированное.
Объявление let не поднимается так же, как var.
Вместо этого он создает привязку в области видимости и инициализирует ее только при выполнении объявления.
Перспектива реализации
Первая строка: name = 'ashu';
Когда движок JavaScript выполняет назначение name = 'ashu';,
он проверяет наличие имени в текущей области. Поскольку name объявлено с помощью let, но находится в TDZ (временной мертвой зоне), любая попытка доступа к нему до инициализации объявления let приведет к ReferenceError.
Следовательно, на данный момент имя находится в TDZ, а имя назначения = 'ashu'; приводит к ошибке ReferenceError.
Вторая строка: let name;
Эта строка инициализирует переменную имени в области действия блока.
После этого имя больше не находится в TDZ, и к нему можно получить доступ или назначить без ошибок.
Теперь бонусный совет
разница между необъявленным, неопределенным и неинициализированным;
undeclare :- переменная еще не объявлена.
не определено : — переменная объявлена, но не инициализирована;
неинициализированный :- переменная определена, но ее значение будет получено позже.
Пример:- const result = MultipleBy2(5);
до тех пор, пока значение возврата функции не будет присвоено результату, пока он не окажется в неинициализированной зоне.
интересный факт:-
Вы знаете, что временная мертвая зона изначально была оформлена для Const, но позже была принята в **Let**
Ссылка:-
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3