Является ли объект окна родным объектом 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 (и связанное с ним обсуждение). За кадром все немного сложнее, но выглядит примерно так, как вы описываете пользователю.