Подтвердить что ты не робот

Является ли окно действительно глобальным в Javascript?

Возьмите этот кусок Javascript в браузере:

<script>

console.log(window.someThing);
var x = 12;

function foo() {
   window.otherThing = x;
}

</script>

Внутри foo мы можем получить доступ к window, мы все это знаем, но почему именно?

  • Это какая-то специальная глобальная переменная?
  • Или же "корневая область" (внутри тега script) имеет его как неявную локальную переменную и является ли она просто "унаследованной наследуемой", поскольку любая другая локальная переменная (например, x выше) может быть?

И как это согласуется с переменными, объявленными непосредственно внутри тега script, заданными как свойства window? (Или это не так?)

<script>
var x = 12;
function() {
   console.log(window.x);
}
</script>
4b9b3361

Ответ 1

Причина, по которой вы можете получить доступ к "вне сферы действия" или "бесплатные" переменные в ECMAscript, называется такой цепочкой Scope. Целевая область видимости - это особое свойство из каждого контекста Execution. Как уже упоминалось несколько раз, объект контекста выглядит как минимум:

  • [[Scope]]
  • Объект переменной/активации
  • "this" значение контекста

каждый раз, когда вы обращаетесь к переменной (-name) в контексте (например, для функции), процесс поиска всегда запускается в своем собственном Activation Object. Все формальные параметры, декларации функций и локально определенные переменные (var) хранятся в этом специальном объекте. Если переменное имя не найдено в этом объекте, поиск переходит в цепочку [[Scope]]. Каждый раз, когда функция (-context) инициализируется, она копирует все родительские контекстные переменные/объекты активации в свое внутреннее свойство [[Scope]]. Это то, что мы называем, лексическим масштабом. Именно по этой причине Closures работают в ECMAscript. Поскольку Global context также имеет Variable Object (точнее, ** переменным объектом для глобального объекта является сам глобальный объект), он также копируется в свойство [[Scope]].

Вот почему вы можете получить доступ к window из любой функции: -)

В приведенном выше объяснении есть один важный концептуальный вывод: любая функция в ECMAscript - это закрытие, которое верно. Поскольку каждая функция по крайней мере скопирует глобальный контекст VO в свой свой свой [[Scope]].

Ответ 2

Является ли окно действительно глобальным в Javascript?

Да. Если вы не создадите новую переменную, называемую окном, в более узкой области

function foo() {
    var window;
}

Внутри foo мы можем получить доступ к окну, мы все это знаем, но почему именно?

Любая функция может обращаться к переменным, объявленным в более широкой области. В этом окне нет ничего особенного.

Ответ 3

Все это определено в ECMAScript.

Глобальная лексическая среда, не имеющая внешней лексической среды. Все другие среды вложены в него и привязаны к глобальному объекту со свойствами, указанными спецификацией.

Это помещает свойства глобального объекта в начало цепочки областей видимости, из которых наследуются все остальные среды.

ES 10.2.3 Глобальная среда:

Глобальная среда - это уникальная лексическая среда, созданная до выполнения любого кода ECMAScript. Глобальная среда Запись среды - это запись объектной среды, объект привязки которой является глобальным объектом (15.1). Ссылка на внешнюю среду глобальной среды равна нулю.

По мере выполнения кода ECMAScript дополнительные свойства могут быть добавлены к глобальному объекту, и исходные свойства могут быть изменены.

ES 15.1 Глобальный объект

Уникальный глобальный объект создается до того, как элемент управления входит в любой контекст выполнения.

Если не указано иное, стандартные встроенные свойства глобального объекта имеют атрибуты {[[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true}.

Глобальный объект не имеет внутреннего свойства [[Construct]]; невозможно использовать глобальный объект в качестве конструктора с новым оператором.

Глобальный объект не имеет внутреннего свойства [[Call]]; невозможно вызвать глобальный объект как функцию.

Значения внутренних свойств [[Prototype]] и [[Class]] глобального объекта зависят от реализации.

В дополнение к свойствам, определенным в этой спецификации, глобальный объект может иметь дополнительные свойства, определенные узлом. Это может включать свойство, значение которого является самим глобальным объектом; например, в объектной модели документа HTML свойство window глобального объекта является самим глобальным объектом.

Ответ 5

Окно

- это основная область всех объектов javascript, и она автоматически привязывается к каждой переменной, которую вы определяете, если только вы не используете "var" перед объявлением, в этом случае область действия переменной является локальной (это означает, что она содержащихся внутри родительской функции, или иначе глобально, если вы объявляете свою переменную вне функционального блока). Кроме того, окно определяется как константа, то есть вы не можете переопределить объект окна (вы получите сообщение об ошибке типа "ошибка: повторное отображение окна const" ).

так:

window.foo = 5;

это то же самое, что:

var foo = 5;

или

function() {
foo = 5;
}

а

function() {
var foo = 5;
}

в этом случае "foo" является локальным (window.foo === undefined)

Ответ 6

Глобальная область window применяется только к основному потоку. В веб-рабочих нет глобальной переменной window. Вместо этого у вас есть WorkerGlobalScope внутри WebWorker и в SharedWorkerGlobalScope внутри SharedWorker.

Эта глобальная область работника хранится в переменной self и как MDN описывает ее:

эта область содержит информацию, обычно передаваемую объектами Window.

Это может стать проблемой, когда сторонний код, который вы используете в своем веб-работнике, использует объект окна. Это можно легко решить, объявив переменную window предложенную @FelipeMicaroniLalli в его ответе здесь следующим образом:

var window = self;