Найти в Дзене
Kangaroo

JavaScript: Области видимости переменных

В нашем комьюнити появился контент менеджер, и это хорошая новость сопровождается статьей этого человека.
В нашем комьюнити появился контент менеджер, и это хорошая новость сопровождается статьей этого человека.

Разница между объявлением переменных при помощи var, let и const – это стандартный вопрос, задаваемый на собеседованиях разработчикам. Однако, как показывает практика, тонкости этого вопроса мало кто знает. Поэтому немного приоткроем завесу тайны в этом важном вопросе.

Объявления переменных с помощью оператора var интерпретируются, как если бы они находились в начале функции (или глобальной области видимости, если объявление находится за пределами функции) независимо от того, где фактически находится переменная. Этот эффект носит название «поднятие переменных».

Если переменная объявлена при помощи var внутри функции, то она не поднимается выше тела функции. Также переменная не поднимается выше уровня блока, ограниченного фигурными скобками. И функцию, и код, ограниченный фигурными скобками, мы будем называть «блоком».

Объявление при помощи let не поднимаются к началу блока, поэтому их лучше размещать в блоке первыми. То есть, переменная, объявленная таким образом, будет доступна только внутри блока, в котором находится и только после строки с объявлением.

Объявление при помощи const. Такие переменные считаются константами, их значения нельзя изменять после инициализации. Поэтому их лучше сразу инициализировать, то есть присваивать какое-либо начальное значение. Область видимости констант также ограничена текущим блоком, это нужно учитывать при работе с ними.

Переменная, объявленная с помощью let или const, недоступна до её объявления. Попытка обратиться к ней вызовет ошибку ссылки даже в обычно безопасных операциях по типу typeof. Такая область, в которой эта переменная недоступна, называется «временной мертвой зоной». Как только поток выполнения достигает объявления переменной, соответствующая переменная удаляется из мертвой зоны и становится доступной для использования.

Есть одна тонкость, связанная с использованием const в циклах, т.к. в разных типах цикла const действует по-разному. В обычном цикле for можно использовать const в выражении инициализации, но попытка изменить значение переменной цикла вызовет предупреждение. С другой стороны, объявление const в циклах for-in и for-of действует в точности, как объявление let.

Еще одно отличие заключается в том, что при создании переменной при помощи var создается свойство в глобальном объекте windows. Этого не происходит при объявлении при помощи let и const.

В целом введенные новые объявления переменных при помощи const и let помогают решить ряд проблем JavaScript, связанных с лексическим областями видимости, делая их поведение похожим на поведение переменных в других языках программирования.

Автор: Наталья Валикова - контент менеджер © Kangaroo

Источник: Николас Закас. ECMAScript 6 для разработчиков