С уверенностью в бесчисленных видеороликах на YouTube по этому вопросу я могу с уверенностью сказать, что область действия — одна из самых сложных концепций Javascript, если вы пришли из любого другого языка кодирования. Scope, конечно, существует и в других языках, но в Javascript есть особые обстоятельства, которые создают больше проблем.

Начнем с определения области видимости:

Область – это понятие, в котором элементы (такие как переменные, методы и объекты) доступны.

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

Глобальный охват:

Если что-то находится в глобальной области видимости, это означает, что оно доступно везде в вашем коде. Функции и переменные, объявленные в этой области, могут ссылаться друг на друга, поскольку они находятся в одной области. Не объявлено в области функции или блока.

Область действия:

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

Область блокировки:

Блок в Javascript — это оператор в фигурных скобках (обычно для условного оператора или цикла for). Здесь все становится немного сложнее. Некоторые переменные имеют блочную область видимости. Переменные, объявленные с помощью const и let, имеют блочную область видимости, что означает, что они доступны только внутри блока, в котором они объявлены. Переменные, объявленные с помощью var, не имеют блочной области, а только функции.

Теперь поговорим немного о переменных. Переменные объявляются и инициализируются/назначаются.

let a = "juniper"

Приведенный выше код фактически объявляется и инициализируется одновременно. let a — это объявление, а a = “juniper” — инициализация или назначение. Переменные могут быть объявлены с помощью var, const или let. Переменные также могут быть объявлены без использования ключевого слова. Эти переменные называются глобальными переменными.

var a = "apple"

Хотя var обычно не используется в ES6 (и многие рекомендуют не использовать его), все же важно понимать, как он работает, поскольку вы, вероятно, встретите его в каком-то более старом коде. Var относится к области действия функции, не заблокировано. Это означает, что если переменная, объявленная с помощью var, объявлена ​​в блоке, она остается доступной для следующей внешней области. Однако, если он объявлен только внутри функции, он недоступен для следующей внешней области.

let b = "banana"

Переменные, объявленные с помощью let, имеют область действия как в блоке, так и в области функции. Если они объявлены внутри блока, они доступны только внутри этого блока. Let переменных также можно переназначать.

const c = "cherry"

Переменные, объявленные с помощью const, также относятся к блоку и функции. Разница между const и let заключается в том, что const НЕ МОЖЕТ быть переназначено, но все еще может быть изменено. Например, если const c = [“cherry’] , c.push(“strawberry”) составит c = [“cherry”, “strawberry”].

d = "durian" ‹ — глобальная переменная

Глобальные переменные объявляются без var, const или let и доступны везде, независимо от того, где вы их объявляете в коде. Это особенно проблематично, потому что глобальные переменные будут пытаться переопределять другие переменные и создавать ошибки. По этой причине обычно рекомендуется избегать глобального объявления переменных.

Используя это изображение для справки, мы видим, что объекты в области C могут получить доступ к вещам в области B и области A, но не могут получить доступ к c в области D, потому что функция создает свою собственную область. Если бы переменная была объявлена ​​в области C, область D не смогла бы получить к ней доступ.

Наконец, чтобы продемонстрировать, как объявления переменных различаются по поведению, см. код ниже:

Надеюсь, это поможет понять масштаб! Ниже вы найдете ссылки на полезные видеоролики.

Удачного кодирования!

Различия между Var, Let и Const

var vs let vs const: объявления переменных в ES6 | ЕС2015

Понимание области видимости в Javascript