Вы, должно быть, слышали о подъеме в javascript. И вы думаете, что при запуске программы все назначения и объявления переменных как бы перемещаются наверх.
Вроде переместился наверх!!??
Что это значит?
Ну… он не перемещает код наверх. Это неправильное и нубское объяснение.
Тогда что происходит???
Прежде чем выполнить одну строку кода, движок javascript переходит к каждой строке и назначает каждое объявление переменной в памяти (НЕ В НАЧАЛЕ ФАЙЛА).
Посмотрите на приведенный выше код:
Код еще не выполнен с левой стороны и находится в строке 3.
Но переменная a
уже находится в глобальной области видимости со значением undefined
.
Это называется подъемом.
ммм!!!!!!!!!!!!
Не запутайтесь. Это будет иметь смысл через некоторое время.
Помните, что код еще не выполнен, движок js просматривает код только для того, чтобы получить общее представление о том, ЧТО (переменные, объявления функций) использует ваша программа.
Как и при приготовлении пищи, у вас есть все ингредиенты на месте. Но пока не на плите.
Теперь, когда переменные, используемые в коде, назначены в памяти.
Код может легко работать.
Теперь пришло время выполнить
В настоящее время движок js выполняет строку 5, и если вы посмотрите на правую сторону в глобальной области видимости, значение a
изменилось на 1
от undefined
.
Примеры
- Приведенный выше код еще не выполнен, и переменные
a
иb
назначены в память глобальной области видимости какundefined
2. Приведенный выше код еще не выполнен, а переменная a
и объявление функции ab
назначены памяти глобальной области видимости с a = undefined
и ab = function ab() { console.log(a) }
Помните, что переменные, объявленные withvar
keywords, поднимаются как undefined
.
Объявления обычных функций поднимаются как сама функция.
3. В приведенном выше примере код был выполнен. Итак, что произошло:
— Не выполняя, пройдитесь по файлу и назначьте переменные и объявления функций в глобальную область видимости
— Программа получила только одну переменную a
— Сохраняем в памяти Глобальной области и присваиваем undefined
— Программа еще не запущена, других функций или переменных в области видимости нет, поэтому выполняем скрипт
— Строка 1: a
присваивается undefined
при подъеме, поэтому будет напечатано undefined
- Строка 2: Ничего
— Строка 3: Инициализировать a
с 1
, теперь a
содержит значение 1
as
— Строка 4: Ничего
— Строка 5: console.log a
выводит новое инициализированное значение, т. е. 1
4. В приведенном выше примере код еще не выполнен, а переменная a
объявлена с let
.
Если вы посмотрите на правую сторону, переменная хранится не в глобальной области, а в области сценария, также называемой временной мертвой зоной.
Это означает, что переменная, определенная с помощью let
, поднимается, но недоступна для текущей области, пока не получит значение.
Таким образом, переменные, объявленные с помощью let
и const
, поднимаются, но недоступны для текущей области видимости, пока не получат значение.
5. Приведенный выше код выполняется и выдает ошибку, как описано в предыдущем примере.
Он выдает ReferenceError, говорящий cannot access 'a' before initialization
Это означает, что вы не можете получить доступ к a
, пока не будет выполнена строка 3, где инициализируется переменная.
6. Приведенный выше код еще не выполнен, а переменные a
и b
находятся в области действия сценария, что означает, что они не будут выполняться до тех пор, пока не будут инициализированы.
Также функции, определенные с помощью const
или let
, называются обычными переменными, что означает, что их поднятое значение не похоже на обычные функции, определенные с помощью function a(){}
.
Таким образом, они поднимаются, но не могут использоваться до тех пор, пока не будут инициализированы некоторым значением.
7. Этот временной код выполняется, и перед инициализацией никакая переменная не используется.
Переменные a
и b
инициализируются числом и функцией соответственно, а затем к ним обращаются.
Заключение
Перед выполнением любой программы или функции javascript ее объявления переменных и функций назначаются памяти, поэтому javascript получает информацию о том, какие ингредиенты необходимо использовать для выполнения сценария. И тогда скрипт выполняется.
Эта концепция называется подъемом в javascript.