Является ли объект окна родным объектом ECMAScript в веб-браузерах?

Спецификация ECMAScript определяет "уникальный глобальный объект, который создается до того, как элемент управления войдет в любой контекст выполнения". Этот глобальный объект является стандартным встроенным объектом ECMAScript и, следовательно, собственным объектом.

В спецификации также говорится:

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

Итак, в веб-браузерах window объект - это просто удобное имя для глобального объекта ECMAScript, и, следовательно, window Объект является родным объектом ECMAScript.

Я правильно понял?

3 ответа

Решение

Это в основном сводится к вопросу о том, что на самом деле означает быть "нативным объектом" или "хост-объектом". Спецификация ECMAScript предоставляет довольно абстрактные определения этих терминов, и есть много возможностей для различных интерпретаций определений. Например, в определении нативного объекта, о чем на самом деле говорит слово "семантика". Является ли это просто семантикой примитивного объекта (в ES, определяемой внутренними свойствами [[propName]]) или она включает семантику уровня приложения объекта. Оконный объект DOM, безусловно, имеет наблюдаемую семантику прикладного уровня, которая не определена в спецификации ES, поэтому, если рассматривать эту семантику, он не может быть "собственным объектом".

Ответ, вероятно, будет намного проще, если вы посмотрите на него как на вопрос о прагматике реализации. Реализатор механизма ES, вероятно, думает, что любой объект, выделенный в куче ES и управляемый сборщиком мусора ES, является "собственным объектом ES". "Хост-объект" обычно рассматривается как нечто, существующее вне кучи ES, и доступ к нему осуществляется с использованием некоторого уровня взаимодействия, такого как COM, XPCOM или API встраивания V8. В зависимости от реализации объект окна DOM может попадать в любую категорию. Это различие, вероятно, более актуально как для разработчиков ядра, так и для хост-провайдеров, чем любое из различий уровня спецификации.

Скорее всего, в следующем издании спецификации ES появятся дополнительные уточняющие определения. Существует даже предложение исключить терминологию "нативного" и "основного" объекта: http://wiki.ecmascript.org/doku.php?id=strawman:terminology. Однако неясно, действительно ли такие определения имеют большое практическое влияние.

Я мог (и, вероятно, буду) утверждать, что спецификация не требует, чтобы глобальный объект был нативным объектом. Спецификация определяет нативный объект как:

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

И определение хост-объекта:

объект, предоставленный хост-средой для завершения среды исполнения ECMAScript.

Определение объекта хоста, безусловно, может быть применено к windowэто объект, предоставленный хост-средой для завершения среды исполнения ECMAScript. Кроме того, его семантика не полностью определяется спецификацией ECMAScript.

Существует также случай, когда механизмы ECMAScript, которые работают в браузерах, таких как V8, TraceMonkey и т. Д., Не создают window объект. Скорее, он предоставляется DOM (создается и наследуется от DOMWindow или же Window, например).

Да, ваши рассуждения звучат о правильном. Как полу-доказательство, когда функция выполняется без явного this ("в глобальном контексте"), его this будет оценивать window внутри тела функции. Но это действительно JSVM-специфично. Например, взгляните на это сообщение для пользователей v8 (и связанное с ним обсуждение). За кадром все немного сложнее, но выглядит примерно так, как вы описываете пользователю.

Другие вопросы по тегам