В javascript область видимости строится на замыканиях (вложенности функций), есть три оператора объявления переменных:
var - переменная будет видна в текущей функции и во всех функциях объявленных внутри текущей функции, включая те, что объявлены внутри вложенных функций, данное объявление всплывает на начало функции не зависимо где в функции оно произведено
let - переменная будет видна в пределах текущего блока после ее объявления (не всплывает в отличии от
var), а так же во всех вложенных в текущий блок блоках и функциях
Так же нужно отметить, что такое объявление произведенное в циклах создаст новую переменную на каждую итерацию цикла
const - все то же самое, что и для
let + значение нельзя изменить
Важно отметить, что для объектов значением переменной является ссылка на объект, а не сам объект, то есть записать в такую переменную что-то еще нельзя, но состояние объекта менять можно
При обращении к переменной она сначала ищется в текущей области видимости, а если в текущей области такой переменной не объявлена, то производится поиск в области видимости выше.
Самой верхней областью видимости является глобальный объект, в нем поиск производится последним, если переменная не найдена и там, то будет возвращено значение
undefined
Важно: в strict режиме (который рекомендуется включать всегда) нельзя использовать не объявленные переменные за исключением в операторе typeof
Многие среды исполнения js создают в глобальном объекте переменную содержащую ссылку на сам глобальный объект, например gui поток браузера создает несколько таких ссылок:
window - глобальный объект текущего фрейма (вкладка браузера, попап-окно, iframe)
top - глобальный объект самого верхнего фрейма (вкладки)
parent - глобальный объект фрейма находящегося на уровень выше, либо равносильно top если текущий фрейм - вкладка браузера или попап-окно
opener - глобальный объект фрейма, породившего текущую вкладку или попап-окно (может быть
null, если текущая вкладка порождена самим браузером)
В webworker'ах и webextension'ах браузера ссылка на глобальный объект хранится в переменной
self
В node.js -
global
Универсальный способ получить глобальный объект в любой среде исполнения:
function getGlobal() {
return (new Function('return this'))();
}
P.S. использование глобальной области видимости - дурной тон