Давайте взглянем на Scopes в целом, а затем на JavaScript.
Мы узнаем, как и где получить доступ к функциям, переменным и объектам в нашем коде.

Что такое области?

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

Типы области

В программировании есть два типа областей видимости: первая — это динамическая область, а другая — лексическая или статическая область.

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

Лексическая область

Области подразделяются на два подтипа.
Глобальная область
Локальная область действия

Глобальный масштаб

Если переменная определена на глобальном уровне, мы можем сказать, что ее область действия является глобальной. Не понял? Позвольте мне объяснить это.
Если мы определяем переменную в начале кода, к ней можно получить доступ в любом месте файла.
Например, у нас есть index.js

Здесь у нас есть переменная a, которая определена на глобальном уровне, поэтому ее область действия является глобальной. Мы можем получить доступ к этой переменной в любом месте нашего файла. Если вы выполните этот приведенный выше код, вы получите следующий результат

Понятно? Давайте посмотрим на другой пример, а также узнаем, как будет осуществляться доступ к глобальной переменной.

Итак, здесь у нас есть вложенная функция дочерняявнутри mainFunc
. Когда мы выполняем mainFunc, она вызывает дочернюю функцию, где log a.
Давайте посмотрим, как эта дочерняя функция будет обращаться к глобальной переменной a.
Сначала она найдет a в child, в этом случае у нас нет переменной a, поэтому она перейдет к родительской функции mainFunc и найдет a в эта функция. Опять же, у нас нет переменной a в функции. Он перейдет в глобальную область (вне функции), и там у нас есть a, он получит значение и распечатает его.

Локальная область

Хорошо, давайте перейдем к локальной области и посмотрим, как это работает
Переменная определяется как локальная переменная, если она объявлена ​​на локальном уровне, т.е. внутри функции, и эта переменная привязана только к этой конкретной функции.
Вот первый пример

В этом примере у нас есть два элемента a,один из которых находится внутри функции (локальный уровень), а другой — снаружи (на глобальном уровне).
При выполнении этого фрагмента кода будет вызвана myFunc, где будет объявлена ​​новая переменная a, а затем console.log(a), который будет искать внутри функции, которая у нас есть в этом случае, поэтому он будет использовать этот a и не выходить за пределы функции. Таким образом, результатом будет «Inside Function».

Вот сложный пример (не очень сложный)

Итак, в этом фрагменте кода у нас есть переменная a, объявленная трижды, один раз на глобальном уровне, второй и третий в локальных функциях. При вызове myFunc будет вызвана новая переменная myOtherFunc, и мы перейдем к этой вложенной функции. Здесь у нас будет третий a в стеке. Думаю, теперь вы можете объяснить, какой a будет вызываться и как он будет называться, верно? но позвольте мне все же попытаться объяснить.
Итак, здесь console.log будет искать a в локальной области, которая у нас есть в этом случае, и получить значение и зарегистрируйте его.
Представьте, если мы удалим это объявление из вложенной функции, в этом случае a будет искаться внутри вложенной функции, а если не будет найдено, поиск будет передан на верхний уровень (myFunc), откуда будет получено его значение.

Динамический против лексического

Давайте быстро посмотрим на разницу, Итак

Динамическаяобласть действия означает, откуда вызывается переменная, а Лексическаяобласть действия означает, откуда вызывается переменная
Давайте разберемся с этим на примере.

В динамической области видимости этот фрагмент кода выведет 20, а в лексической области видимости — 10.
Вы уже знаете, как лексическая область видимости напечатает 10, она будет искать a в func, не найдя его, он начнет искать его в глобальной области.
В случае динамической области он будет искать a в func, не найдя его, он будет искать его в том месте, откуда был вызван func, из которого находится func2, там у нас есть значение 20, поэтому 20 будет напечатано.