Всплытие переменных и функций


Всплытие переменных и функций

hoisting

Поднятие или hoisting — это механизм в JavaScript, в котором переменные и объявления функций, передвигаются вверх своей области видимости перед тем, как код будет выполнен.

Ещё до выполнения кода интерпретатор JavaScript загружает в память функции, объявленные как function declaration , а также объявления переменных и функций function expression , но не их значения. В результате функцию function declaration можно вызвать ещё до того, как до неё дойдёт построчное выполнение кода.

ℹ️ note

На этапе создания, движок JavaScript просматривает код и, как только он видит ключевое слово var или ключевое слово function , он выделяет некоторую память для них.

👀 Рассмотрим следующий пример:

Объяснение 🎓

Объявленная через var переменная myname всплывает. До того, как выполнение кода дойдёт до неё, значение переменной равно undefined . В первую очередь интерпретатор ищет переменную внутри области видимости функции, находит её и дальше уже не ищет. Поэтому первый результат выведет undefined – внутри кода функции переменная уже объявлена, но ещё не инициализирована.

Инициализация – присвоение переменной значения.

Поднятие функций

Одним из преимуществ JavaScript является помещение объявления функций в память, перед выполнением любого сегмента кода. Объявления функций поднимаются, но они идут на самый верх, поэтому они будут находиться над всеми объявлениями переменных. Это позволяет нам использовать функцию до того, как мы объявим её в своем коде. Например:

Undefined vs ReferenceError

В JavaScript, необъявленной переменной при выполнении кода назначается значение undefined , а так же и тип undefined .

В JavaScript, ReferenceError появляется при попытке доступа к предварительно необъявленной переменной.

❗️ Важно

JavaScript непреклонно сначала объявляет, а уже затем инициализирует наши переменные.

Поднятие const, let и var

var – это традиционный способ объявления переменных в JavaScript.

ES6 (ECMAScript 6) представил два новых способа объявления переменных: const и let , и, как правило, они рекомендуются во избежание неожиданных осложнений при подъеме.

Ключевое слово var

  • var имеет область действия функции;
  • объявления var поднимаются, но не инициализируются.

Код выше, из-за поднятия эквивалентен приведенному коду ниже.

Ключевые слова const / let

const и let имеют область видимости блока.

❗️ Важно

Мы должны помнить, что концепция поднятия не является буквальным процессом (т. е. сами объявления не перемещаются в начало файла – это просто процесс компилятора JavaScript, который сначала читает их, чтобы освободить для них место в памяти).

Разница между объявлениями var / function и объявлениями let / const заключается в инициализации. Первые инициализируются с неопределенным значением undefined . Однако вторые, лексически объявленные переменные, остаются не инициализированными. Это означает, что ReferenceError

выбрасывается при попытке доступа к ним. Они будут инициализированы только после того, как операторы let / const будут определены. Всё что до, называется временной мертвой зоной.

:pencil: Временная мертвая зона

Это не синтаксическое местоположение, а время между созданием переменной (области) и инициализацией. Ссылка на переменную в коде над объявлением не является ошибкой, если этот код не выполняется (например, тело функции или просто мертвый код), но ошибка будет выдана, если мы запросим доступ к переменной до её инициализации.

Экземпляры var и let могут быть инициализированы без значения, в то время как const выдаст ошибку ReferenceError

, и если попытаться объявить её без одновременного присвоения ей значения.

Так что const myName = ‘Alex’ будет работать, но const myName; myName = ‘Alex’; не будет.

С помощью var можно использовать значение до того, как оно будет присвоено, и оно вернет undefined . Если сделать, то же самое с let – будет ReferenceError .

Если создать переменную с помощью var на верхнем уровне (глобальный уровень), создастся свойство для глобального объекта; в случае с браузером – это объект window .

Если попробовать повторить тоже самое с let

🔥 Важно

let не создает свойств в глобальном объекте.

Следствием блочной области видимости переменных, объявленных с помощью директивы let , является замыкание значения переменной цикла на каждой итерации блока for:

Обратите внимание, что отсутствие явных фигурных скобок не меняет принцип поведения переменных, объявленных с помощью директивы ` let

Самостоятельная работа 👩‍💻👨‍💻

Задание :one:

Поверните данную строку в правильном направлении, периодически удаляя одну букву с конца строки и прикрепляя ее к передней части.

подсказка: используйте substring()

Задание :two:

Напишите функцию, чтобы найти наиболее частый элемент в заданном массиве.

Задание :three:

Напишите функцию для поиска и удаления повторяющихся значений в массиве. Функция должна возвращать массив повторяющихся значений.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *