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).