оригинал:2Али тоже ненавидит.com/2019/07/…
Переводчик: Лю Сяоси
В этом сообщении блога мы рассмотримJavaScriptкак работают глобальные переменные. Такие как:scriptsОбласть действия так называемого глобального объекта и т.д.
Другие статьи можно нажать: GitHub.com/Иветт Л.А. Ю/Б…
1 Область применения
Лексическая область видимости (сокращенно: область действия) переменной — это область программы, которая может получить к ней доступ.JavaScriptОбласти являются статическими (они не меняются во время выполнения) и могут быть вложенными, например:
function func() { // (A)
const foo = 1;
if (true) { // (B)
const bar = 2;
}
}
ifОбласть действия, введенная оператором (строка B), вложена в функциюfunc()(Строка A) по объему.
В примереfuncдаifвнешний охват.
2. Лексический объем
существуетJavaScriptВ спецификации языка область видимости «реализуется» через лексическую область видимости. Они состоят из двух частей:
- Запись среды (подумайте о словаре), которая сопоставляет имена переменных со значениями переменных. Это
JavaScriptГде хранить переменные. один из экологических рекордовkey-valueЗаписи называются привязками. - Ссылка на внешнюю среду — среда, представляющая внешнюю область области, представленной текущей средой.
Таким образом, вложенное дерево областей может быть представлено вложенным деревом среды.
3. Глобальный объект
Глобальный объект — это объект, свойства которого являются глобальными переменными.
- Вездесущий: глобальный
this - Другие имена глобального объекта зависят от платформы и языковой конструкции:
- window: это классический способ ссылки на глобальный объект, но он работает только в обычных браузерах;
Node.jsа такжеWeb Workersсередина. - self: доступен везде в браузере, включая
Web Workers. ноNode.jsЭто не поддерживается. - глобальный: только в
Node.jsдоступно в.
- window: это классический способ ссылки на глобальный объект, но он работает только в обычных браузерах;
Глобальный объект содержит все встроенные глобальные переменные.
4. Глобальная среда
Глобальная область — это «самая внешняя» область — у нее нет внешней области. Его среда — это глобальная среда. Каждая среда связана с глобальной средой через серию сред, связанных внешними ссылками. Внешняя ссылка на глобальную средуnull.
Глобальная среда сочетает в себе дваЭкологические записи:
- Объектно-подобная запись среды, которая действует как обычная запись среды, но поддерживает синхронизацию своих привязок с объектом. В этом случае объект является глобальным объектом.
- Записи декларативной среды.
На следующей диаграмме показаны эти структуры данных.
Следующие два подраздела объясняют, как комбинировать объектные записи и декларативные записи.
4.1 Создание переменных
Чтобы создать действительно глобальную переменную, вы должны находиться в глобальной области видимости — должны находиться вscriptsверхний уровень:
- верх
const,letа такжеclassСоздайте привязки в декларативных записях среды. - верх
varобъявления функций создают привязки в записях среды объектного стиля.
<script>
const one = 1;
var two = 2;
</script>
<script>
// All scripts share the same top-level scope:
console.log(one); // 1
console.log(two); // 2
// Not all declarations create properties of the global object:
console.log(window.one); // undefined
console.log(window.two); // 2
</script>
Кроме того, глобальный объект содержит все встроенные глобальные переменные и предоставляет их глобальной среде через объектно-подобные записи.
4.2 Чтение/настройка переменных
Декларативные записи среды выигрывают, когда мы получаем или устанавливаем переменную, и обе записи среды имеют привязку к этой переменной:
<script>
let foo = 1; // 声明式环境记录
globalThis.foo = 2; // 对象式环境记录
console.log(foo); // 1 (声明式记录获胜)
console.log(globalThis.foo); // 2
</script>
5. Среда модуля
У каждого модуля есть своя среда, в которой хранятся все объявления верхнего уровня, включая импорт. Внешней средой среды модуля является глобальная среда.
Вывод: почему в JavaScript есть как глобальные переменные, так и глобальные объекты?
Глобальные объекты обычно считаются неправильными. Таким образом, более новые конструкции (например,const,letа такжеclasses) создаст обычные глобальные переменные, а не свойства глобального объекта. (существуетscriptкогда в размахе).
К счастью, большинство из них используют современныеJavaScriptНаписанный код существует вECMAScriptмодули иCommonJSв модуле. Каждый модуль имеет свою собственную область видимости, поэтому правила, управляющие глобальными переменными, редко важны для кода, основанного на модулях.
Наконец, спасибо за вашу готовность потратить свое драгоценное время на чтение этой статьи. Если эта статья дала вам небольшую помощь или вдохновение, пожалуйста, не скупитесь на лайки и звезды. двигаться вперед.GitHub.com/Иветт Л.А. Ю/Б…