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

Как гласит MDN: Контекст, в котором значения и выражения видны или на которые можно ссылаться.

Есть два типа прицелов: -

  • Глобальный масштаб
  • Локальная область действия
    Но я также собираюсь поговорить о лексической области действия.

Что такое Global Scope?

Глобальная область видимости - это термин, используемый, когда переменная объявляется вне какой-либо из функций, т.е. переменные должны быть объявлены глобально.

Итак, если вы посмотрите на приведенную выше функцию, переменная a объявлена ​​глобально, и к ней можно получить доступ внутри функции. Здесь функция iAmLocal () создала свою собственную область видимости. Но вот переменная объявлена ​​в глобальной области видимости. Итак, дело в том, что если мы объявили переменную глобально, к ней можно будет получить доступ внутри функции.

Возьмем другой пример: -

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

Он изменился, потому что переменная a доступна внутри функции, поскольку она объявлена ​​глобально. Итак, когда мы вызываем функцию IAmLocal (), она снова переназначает значение a. Теперь перейдем к локальной области видимости.

Что такое локальный охват?

Когда мы объявляем функцию, она создает свою собственную область видимости. Итак, всякий раз, когда функция объявляется, она создает свою локальную область видимости, которая ограничена этой функцией. Итак, это означает, что если вы объявляете переменную внутри функции, она ограничивается ею. Итак, давайте разберемся с этим на примере кода: -

Давайте обратимся к переменной вне функции.

Упс !! Он сообщает об ошибке, потому что теперь движок ищет переменную b глобально, но не может найти значение, поскольку оно объявлено в iAmLocal (). Вот почему он возвращает ошибку.

Возьмем другой пример: -

Итак, можем ли мы получить доступ к a внутри secondNumber (). Давай попробуем запустить его. Если мы получим 15, значит, можем.

Да, это так.

Почему так случилось?

Поскольку, когда объявляется sum (), он создает свою собственную область видимости, а переменные, объявленные внутри нее, могут быть доступны в пределах области действия sum (). Но когда мы объявляем функцию secondNumber () внутри sum (), она также создает свою собственную область видимости. Итак, когда мы вызываем secondNumber (), он будет искать значение a. Он не находит a, он переходит к родительскому объекту и проверяет, есть ли a. Да, он находится там и успешно выполняет это значение.

== Лексическая область видимости ==

Итак, Lexical Scope - это то же самое, что и вложенные локальные области, но между ними есть небольшая разница. В этом случае, если текущая область видимости не находит значение, она перемещается за пределы этой области и пытается найти значение там. Этот процесс продолжается до тех пор, пока не будет найдено значение. Сделаем это на примере: -

Итак, в приведенном выше примере кода я объявил num1 глобально, потому что он находится вне всех циклов. Теперь, когда мы объявили функцию add (), она создает свою собственную область видимости. Вот почему num2 объявлен локально, поэтому доступен в области действия функции add (). Итак, давайте подумаем и внимательно посмотрим на код, дает ли он нам 13 или нет.
Давайте выполним: -

Итак, что здесь произошло?
Давайте перейдем к той строке, где мы вызвали add () и сохранили ее в переменной с именем addIt (). Итак, теперь addIt () содержит функцию возврата, которая возвращается функцией add (), и когда мы вызываем возвращаемую функцию, мы получаем правильный ответ. Итак, дело в том, как получить доступ к значению num1. Итак, я пишу выше, что если переменная не находит своего значения внутри этой функции, она всплывает, то есть идет вверх. Итак, теперь функция, возвращаемая функцией add (). Теперь num1 обнаруживает, что это мое значение, представленное в этой области, если это не так, поэтому он перемещается в область действия add () и проверяет, что мое значение представлено здесь или нет. Нет, он переходит в глобальную область видимости, где находит значение и выполняет его. Итак, процесс выделения и нахождения его значения называется лексической областью действия.
Если значение не найдено, возвращается сообщение об ошибке, указывающее, что переменная не определена.

Let & Const - ›Как они влияют на область видимости

Итак, let и const - новые члены в семействе объявлений переменных в JavaScript. Таким образом, они помогают нам создать область видимости и помогают не поднимать переменную. Возьмем пример: -

Давайте посмотрим: -

Итак, мы можем получить доступ к переменной i вне цикла, потому что мы знаем, что только функция может создавать свою собственную область видимости. Итак, цикл for объявлен в глобальной области видимости. Вот почему в последнем, когда цикл был выполнен, мы получили увеличенное значение i.
Давайте сделаем это еще раз, но поместим let вместо var : -

Да, он сказал ошибку о том, что i не определен, потому что let создает область для этой переменной.
const - это то же самое, что и let, но вы не можете переназначить значение снова. Таким образом, присвоение значения с помощью var, let и const зависит от ваших потребностей: вы хотите получить доступ к этой переменной локально или хотите обновить переменную как ему присвоено новое значение.

Спасибо за прочтение…

Следуйте за мной в Twitter и проверяйте все эти Gists на GitHub.

Первоначально опубликовано на https://praveen-me.github.io/blog/javascript-scopes 6 сентября 2018 г.