Область видимости – это набор правил, определенных в языке программирования для определения значения переменной.
JavaScript использует лексическую область видимости , что означает, что значение переменной определяется ее положением при ее написании. Не тогда, когда он вызывается, что происходит с альтернативой динамический охват .
Область видимости – это набор переменных, видимых для части программы.
У нас есть глобальная область действия, область действия блоков и область действия функций. Если переменная определена вне функции или блока, она присоединена к глобальному объекту и имеет глобальную область видимости, что означает, что она доступна в каждой части программы.
Существует очень важное различие между var , let и const объявления.
Переменная, определенная как var внутри функции, видна только внутри этой функции. Точно так же, как параметры функции.
Переменная, определенная как const или let , с другой стороны, видна только внутри того блока, где она находится.
Важно понимать, что блок (обозначенный парой фигурных скобок) не определяет новую область для var , но он определяет позвольте и строительство . Новая область для var создается только при создании функции, потому что var не имеет области блока, но область действия функции.
Внутри функции любая переменная var , определенная в ней, видна во всем коде функции, даже если переменная объявлена в конце функции, на нее все равно можно ссылаться в начале, потому что JavaScript перед выполнением кода фактически перемещает все объявления переменных сверху (что называется подъем ). Чтобы избежать путаницы, всегда объявляйте переменные var в начале функции.
Вот что я имею в виду. Даже если вы объявите переменную var в конце функции, ее объявление переместится наверх:
function run() {
console.log(`${name}`)
var name = 'Flavio'
}
run()Это выводит “неопределенный”, потому что на самом деле происходит следующее:
function run() {
var name;
console.log(`${name}`)
name = 'Flavio'
}
run()позвольте и const не “страдают” от подъема. Если вы используете один из них в приведенном выше примере, вы получите сообщение об ошибке: Ошибка ссылки: имя не определено .
В JavaScript переменные родительской функции также становятся доступными для внутренних функций. Область действия внутренней функции также включает в себя область действия родительской функции, и это называется замыканием (мы более подробно поговорим об этом позже).
Есть одна маленькая вещь, о которой вам нужно знать. В нестрогом режиме, если вы используете переменную без ее объявления, где бы вы это ни делали, эта переменная будет присоединена к глобальной области видимости. Что может быть плохим источником ошибок. Поэтому убедитесь, что вы всегда объявляете переменные перед их использованием. Просто имейте это в виду, но это просто еще одна причина использовать строгий режим по умолчанию, который решает эту проблему. Мы поговорим о строгом режиме позже.
Помните: любая переменная, определенная в функции (или блоке) с тем же именем, что и глобальная переменная, имеет приоритет над глобальной переменной, затеняя ее.
Это выводит неопределенный :
var name = 'Roger'
function run() {
console.log(`${name}`)
var name = 'Flavio'
}
run()и это вызывает ошибку Ошибка ссылки: имя не определено :
let name = 'Roger'
function run() {
console.log(`${name}`)
let name = 'Flavio'
}
run()Оригинал: “https://flaviocopes.com/javascript-scope/”