Каждое здание нуждается в прочном фундаменте. Понимание переменной области видимости в JavaScript является одним из ключей к созданию прочной основы. В этой статье будет рассказано, как работает область видимости JavaScript. Мы также рассмотрим смежную тему, известную как подъем .
Переменная сфера
Для эффективной работы с JavaScript одной из первых вещей, которые вам необходимо понять, является концепция переменной области видимости. Область действия переменной определяется местоположением объявления переменной и определяет ту часть программы, в которой доступна определенная переменная.
Правила области видимости варьируются от языка к языку. JavaScript имеет две области применения — глобальную и локальную . Любая переменная, объявленная вне функции, относится к глобальной области видимости и поэтому доступна из любой точки вашего кода. Каждая функция имеет свою область видимости, и любая переменная, объявленная в этой функции, доступна только из этой функции и любых вложенных функций. Поскольку локальная область в JavaScript создается функциями, она также называется областью действия. Когда мы помещаем функцию в другую функцию, мы создаем вложенную область видимости.
В настоящее время JavaScript, в отличие от многих других языков, не поддерживает область видимости на уровне блоков. Это означает, что объявление переменной внутри блочной структуры, такой как цикл for
, не ограничивает эту переменную циклом. Вместо этого переменная будет доступна из всей функции. Стоит отметить, что грядущий ECMAScript 6 будет поддерживать области действия уровня блока через ключевое слово let
.
Чтобы прояснить ситуацию, давайте используем простую метафору. У каждой страны в нашем мире есть границы. Все в этих границах принадлежит стране. В каждой стране много городов, и у каждого из них есть свой город. Страны и города похожи на функции JavaScript — у них есть свои локальные возможности. То же самое относится и к континентам. Хотя они огромны по размеру, их также можно определить как локали. С другой стороны, мировые океаны не могут быть определены как имеющие локальную область действия, поскольку они фактически охватывают все локальные объекты — континенты, страны и города — и, таким образом, его область действия определяется как глобальная. Давайте представим это в следующем примере:
var locales = { europe: function() { // The Europe continent's local scope var myFriend = "Monique"; var france = function() { // The France country's local scope var paris = function() { // The Paris city's local scope console.log(myFriend); }; paris(); }; france(); } }; locales.europe();
Теперь, когда мы понимаем, что такое локальные и глобальные области действия и как они создаются, пришло время узнать, как интерпретатор JavaScript использует их для поиска конкретной переменной.
Возвращаясь к данной метафоре, допустим, я хочу найти моего друга по имени Моник. Я знаю, что она живет в Париже, поэтому я начинаю свои поиски оттуда. Когда я не могу найти ее в Париже, я поднимаюсь на один уровень выше и расширяю свои поиски во всей Франции. Но опять же, ее там нет. Затем я снова расширяю свой поиск, поднимаясь на другой уровень. Наконец, я нашел ее в Италии, которая в нашем случае является локальным пространством Европы.
В предыдущем примере мой друг Моник представлен переменной myFriend
. В последней строке мы вызываем функцию europe()
, которая вызывает france()
, и, наконец, когда вызывается функция paris()
, начинается поиск. Интерпретатор JavaScript работает из текущей выполняемой области и работает до тех пор, пока не найдет указанную переменную. Если переменная не найдена ни в одной области видимости, возникает исключение.
Этот тип поиска называется лексической (статической) областью действия . Статическая структура программы определяет область видимости переменной. Область видимости переменной определяется ее расположением в исходном коде, а вложенные функции имеют доступ к переменным, объявленным в их внешней области видимости. Независимо от того, откуда вызывается функция или даже как она вызывается, ее лексическая область видимости зависит только от того, где была объявлена функция.
В JavaScript переменные с одинаковыми именами можно указывать на нескольких уровнях вложенной области видимости. В таком случае локальные переменные получают приоритет над глобальными переменными. Если вы объявляете локальную переменную и глобальную переменную с одинаковым именем, локальная переменная будет иметь приоритет, если вы будете использовать ее внутри функции. Этот тип поведения называется слежкой . Проще говоря, внутренняя переменная затеняет внешнюю.
Именно этот механизм используется, когда интерпретатор JavaScript пытается найти определенную переменную. Он начинается с самой внутренней области, выполняемой в то время, и продолжается до тех пор, пока не будет найдено первое совпадение, независимо от того, есть ли другие переменные с таким же именем на внешних уровнях или нет. Давайте посмотрим на пример:
var test = "I'm global"; function testScope() { var test = "I'm local"; console.log (test); } testScope(); // output: I'm local console.log(test); // output: I'm global
Как мы видим, даже с тем же именем локальная переменная не перезаписывает глобальную переменную после выполнения функции testScope()
. Но это не всегда правда. Давайте рассмотрим это: