❝Вы учитесь в Интернете, осваиваете новые навыки или Интернет помогает вам реализовать себя, тогда Интернет — ваш инструмент, если вы просто играете в Интернете и тратите свое время и деньги, но получаете только духовное удовлетворение, то вы есть; инструмент Интернета. В свободном мире вы являетесь продуктом - «Взросление». ❞
OuterEnv
串联globalThis
не указывая прямо наглобальный объектWindowProxy
да一个将所有访问转发到当前窗口из对象Запись среды объекта
иОбъявить записи среды
来管理变量const
,let
иclass
创建из变量被绑定到Объявить записи средысерединаvar
ифункция声明из变量被绑定到Запись среды объектасерединаglobalThis
我们平时常说из变量из Объем(scope
),Его полное имя должно быть«лексическая область видимости»(lexical scope
)。它да程序середина可以переменные Область доступа, то есть Объем, управляет видимостью и временем жизни переменных и функций.
В нашей предыдущей статье мы описали основной процесс выполнения JS-кода V8. 1. Сначала скомпилируйте 2. После выполнения。существовать这个编译из过程就да«Статический»из。Итак, мы можем сказать,Объемда«Не меняется во время выполнения кода»из变量查找机制。
❝Область применения JS статична. ❞
В то же время области видимости также могут быть вложенными.
function func() { // (A)
const v1 = 1;
if (true) { // (B)
const v2 = 2;
}
}
Как показано выше: существоватьB行изif
语句内嵌существоватьA行изfunc()
функция Объем.
Мы ставим внутреннюю Объем外面из Объемназывается:outer
Объем.Например:func
Объем就даif
Объемиз outer
Объем.
Определено в спецификации языка ecma262 (принесите свою 🪜):
❝Объемпроходить«лексическая среда»实现из ❞
Лексическая среда состоит из двух важных частей:
binding
)。OuterEnv
внутренние свойства:ориентированный«Внешняя среда»(outer ссылка на окружение)Вложенные деревья областей действия в коде связаны OuterEnv, указывающим на внешнюю среду. Прямо сейчас:
❝ОбъемChain переменных от лексическая средасередина
OuterEnv
串联 ❞
Глобальный объект — это объект, свойства которого становятся глобальными переменными. Доступ к глобальным объектам можно получить следующим образом.
globalThis
: Все платформы/Среда хоста может получить доступ,он работает с глобальными переменнымиthis
из值相等。// среда браузера
`globalThis === this //true`
// node REPL
`globalThis === this //true`
window
:它существовать浏览器«Основная тема»环境Вниз生效,但дасуществоватьWeb Workers/Node
环境Вниз失效self
: Эффективен в среде браузера (основной/веб-интерфейс). Worker),существоватьNode
环境Вниз失效global
: 只有существоватьNode
环境Вниз生效globalThis
существоватьсреда браузера Вниз,globalThis
не указывая прямо наглобальный объект。
Например,现существовать有一个网页存существовать一个iframe
:
iframe
серединаизsrc
из值发生变更,Он получит новый глобальный объектiframe
изsrc
из值如何变化,globalThis
из值一直不变现существовать有两个html
1. parent 2. child
parent.html
<iframe src="child.html?first"></iframe>
<script>
const iframe = document.querySelector('iframe');
const icw = iframe.contentWindow; // iframeиз`globalThis` iframe.onload = () => {
// Доступ к глобальным атрибутам iframe через globalThis
const firstGlobalThis = icw.globalThis;
const firstArray = icw.Array;
console.log(icw.iframeName); // 'first'
iframe.onload = () => {
const secondGlobalThis = icw.globalThis;
const secondArray = icw.Array;
// глобальный объект изменился
console.log(icw.iframeName); // 'second'
console.log(secondArray === firstArray); // false
// globalThis Это все еще исходное значение
console.log(firstGlobalThis === secondGlobalThis); // true
};
iframe.src = 'iframe.html?second';
};
</script>
child.html
<script>
// Рекомендовать глобальный от globalThis объект Добавить новыйbinding(экологический Записи значений имени в записи называются привязками.)
globalThis.iframeName = location.search.slice(1);
</script>
globalThis
проходить两个внутренние свойства保持值из不变:
Window
ориентированныйглобальный объект。каждое изменениеlocation
(Кwindow.location.href
Назначение/проходить改变iframe
изsrc
)它из值也会随之改变。WindowProxy
да一个将所有访问转发到当前窗口из对象。该对象永远不会改变существоватьсреда браузера Вниз,globalThis
ориентированныйWindowProxy
;существовать其他环境Вниз,globalThis
直接ориентированныйглобальный объект。
общая ситуация Объемда«Внешний слой»из Объем:不存существовать包含它из Объем Понятно。与之匹配из环境变量(environment)дляглобальная среда(global environment)。每一个内部环境变量проходитьouterEnv
构建из Объем Цепочка заканчиваетсяглобальная средасоединять。глобальная средаизouterEnv
даnull。
Записи глобальной среды (примечание: в отличие от глобальной среды) используют два типа записей среды для управления переменными.
В JS,只有существоватьscript
из顶层才属于общая ситуация Объем.相反из,Каждый модуль имеет свой объем.,И этот Объем служит подмножеством глобального Объема.
Для описания отношений между ними используется псевдокод:
{ // общая ситуация Объем
// (глобальная переменная)
{ // module 1 Объем
···
}
{ // module 2 Объем
···
}
// (....)
}
Чтобы создать глобальную переменную, нам нужно определить и присвоить переменную в глобальной области видимости (верхний уровень скрипта):
const
,let
иclass
创建из变量被绑定到Объявить записи средысерединаvar
ифункция声明из变量被绑定到Запись среды объектасередина<script>
const one = 1;
var two = 2;
</script>
<script>
// Все скрипты имеют общий общий объем.
console.log(one); // 1
console.log(two); // 2
// Не все объявления переменных сохраняются в глобальном масштабе. объектсередина console.log(globalThis.one); // undefined
console.log(globalThis.two); // 2
</script>
Когда мы обращаемся к переменной, которая имеет привязку как в записи среды объявления, так и в записи среды объекта.
❝Переменные в объявленных переменных среды доступны в первую очередь. ❞
<script>
let gv = 1; // Магазин в Объявить записи средысередина globalThis.gv = 2; // Магазин в Запись среды объектасередина console.log(gv); // 1 Переменные в объявленных переменных среды доступны в первую очередь.
console.log(globalThis.gv); // 2
</script>
Помимо переменных, созданных посредством объявлений var и функций, глобальный объект содержит следующие свойства:
использоватьconst
/let
定义изобщая ситуация变量可以保证不受ECMAScriptи宿主环境из内置общая ситуация变量影响。
Например,среда браузера Вниз,存существоватьобщая ситуация变量.location
// Изменить информацию о пути текущей страницы
var location = 'https://789.com';
// Усечение window.location не приведет к изменению информации о текущей странице.
let location = 'https://789.com';
Примечание. Эта ситуация возникает только в глобальной среде.
Среда с глобальной областью действия управляет своими привязками через глобальную запись среды, которая, в свою очередь, основана на двух записях среды:
Глобальные переменные можно создавать путем добавления свойств к глобальному объекту или посредством различных объявлений. Инициализируйте глобальные объекты с помощью ECMAScript и встроенных глобальных переменных среды хоста. Каждый модуль ECMAScript имеет свою собственную среду, а его внешняя среда — глобальная среда.