javascript - I webbläsare, är fönsterobjektet ett inbyggt ECMAScript-objekt?


ECMAScript-specifikationen definierar ett "unikt globalt objekt som skapas innan kontrollen går in i någon exekveringskontext". Detta globala objekt är ett standardiserat inbyggt objekt i ECMAScript, och därför ett inhemskt objekt.

Specifikationen anger också:

Förutom de egenskaper som definieras i denna specifikation kan det globala objektet ha ytterligare värd-definierade egenskaper. Detta kan inkludera en egenskap vars värde är det globala objektet självt; till exempel, i HTML-dokumentets objektmodell är window-egenskapen hos det globala objektet det globala objektet självt.

Så, i webbläsare är window-objektet bara ett bekvämt namn för ECMAScript:s globala objekt, och därför är window-objektet ett inbyggt ECMAScript-objekt.

Förstod jag det här rätt?

Svar #1

Detta handlar mest om en fråga om vad det egentligen innebär att vara ett "nativt objekt" eller ett "värdobjekt". ECMAScript-specifikationen ger ganska abstrakta definitioner av dessa termer och det finns gott om utrymme för olika tolkningar av definitionerna. Till exempel, i definitionen av ett nativt objekt, vad handlar ordet "semantik" egentligen om? Är det bara den primitiva objektsemantiken (i ES specificerad av de interna egenskaperna [[propName]]) eller inkluderar den semantiken på applikationsnivå för objektet? DOM-fönsterobjektet har definitivt observerbara semantiker på applikationsnivå som inte är definierade i ES-specifikationen, så om dessa semantiker beaktas kan det inte vara ett "nativt objekt".

Svaret är förmodligen mycket enklare om du ser det som en fråga om implementeringspraktik. En ES-motorimplementerare tänker förmodligen på vilket objekt som helst som allokeras i ES-högen och hanteras av ES:s skräpinsamling som ett "naturligt ES-objekt". Ett "värdobjekt" skulle allmänt betraktas som något som existerar utanför ES-högen och som nås med någon form av interoperabilitetslager, såsom COM, XPCOM eller V8 embed-dnings-API. Beroende på implementeringen kan DOM-fönsterobjektet falla i vilken kategori som helst. Denna skillnad är förmodligen mer relevant för både motorimplementerare och värdleverantörer än några av specifikationsnivåskillnaderna.

Det kommer troligtvis att finnas ytterligare definitionsförtydliganden i nästa utgåva av ES-specifikationen. Det finns till och med ett förslag om att eliminera termen "native" och "host"-objekt: http://wiki.ecmascript.org/doku.php?id=strawman:terminology. Det är dock inte klart om sådana definitioner verkligen har så stor praktisk påverkan.

Svar #2

Jag skulle kunna (och kommer förmodligen att) hävda att specifikationen inte kräver att det globala objektet är ett inbyggt objekt. Specifikationen definierar ett inbyggt objekt som:

objekt i en ECMAScript-implementation vars semantik är fullständigt definierad av denna specifikation snarare än av värdmiljön.

Och definitionen av ett värdobjekt:

objekt som tillhandahålls av värdmiljön för att slutföra körningsmiljön för ECMAScript.

Definitionen av värdobjektet skulle absolut kunna tillämpas på window, det är ett objekt som tillhandahålls av värd-miljön för att fullborda ECMAScripts körmiljö. Dessutom är dess semantik inte fullt definierad av ECMAScript-specifikationen.

Det finns också fallet att ECMAScript-motorerna som körs i webbläsare, såsom V8, TraceMonkey, etc., inte skapar window-objektet. Istället tillhandahålls det av DOM (konstruerat och ärvande från DOMWindow eller Window, till exempel).