2012-05-11 11 views
5

La specifica ECMAScript definisce un "unique global object that is created before control enters any execution context". Questo oggetto globale è un oggetto predefinito standard di ECMAScript e quindi un oggetto nativo.Nei browser Web, l'oggetto finestra è un oggetto nativo ECMAScript?

La specifica stabilisce inoltre:

Oltre alle proprietà definite in questa descrizione il oggetto globale può avere ospitanti ulteriori proprietà definite. Questo può includere una proprietà il cui valore è l'oggetto globale stesso; ad esempio, nel modello dell'oggetto documento HTML la proprietà window dell'oggetto globale è l'oggetto globale stesso.

Così, nel web browser, l'oggetto window è solo un nome conveniente per l'oggetto globale ECMAScript, e di conseguenza, l'oggetto è un oggetto window ECMAScript nativo.

Ho ricevuto correttamente?

risposta

5

Questo deriva principalmente da una questione di cosa significhi realmente essere un "oggetto nativo" o un "oggetto host". La specifica ECMAScript fornisce definizioni abbastanza astratte di quei termini e c'è ampio spazio per interpretazioni diverse delle definizioni. Ad esempio, nella definizione di oggetto nativo, qual è la parola "semantica" in realtà parlando.È solo la semantica degli oggetti primitivi (in ES specificata dalle proprietà interne [[propName]]) o include la semantica a livello di applicazione dell'oggetto. L'oggetto finestra DOM ha certamente una semantica osservabile a livello di applicazione che non è definita nella specifica ES, quindi se si considera che tale semantica non può essere un "oggetto nativo".

La risposta è probabilmente molto più semplice se si considera come una questione di pragmatica dell'implementazione. Un implementatore del motore ES probabilmente pensa a qualsiasi oggetto allocato nell'heap ES e gestito dal garbage collector ES come un "oggetto ES nativo". Un "oggetto host" viene in genere pensato a qualcosa che esiste all'esterno dell'heap ES e a cui si accede utilizzando una sorta di livello di interoperabilità come COM, XPCOM o l'API di incorporamento V8. A seconda dell'implementazione, l'oggetto della finestra DOM potrebbe rientrare in entrambe le categorie. Questa distinzione è probabilmente più rilevante sia per gli implementatori di motori sia per i provider host rispetto a qualsiasi distinzione di livello delle specifiche.

Ci saranno probabilmente ulteriori chiarimenti sulla definizione nella prossima edizione delle specifiche ES. C'è anche una proposta per eliminare la terminologia dell'oggetto "nativo" e "host": http://wiki.ecmascript.org/doku.php?id=strawman:terminology. Tuttavia, non è chiaro se tali definizioni abbiano davvero un impatto molto pratico.

+0

Uh, ottima risposta ':)' –

0

Sì, il tuo ragionamento suona bene. Come semi-proof, quando una funzione viene eseguita senza esplicita this ("nel contesto globale"), la sua this verrà valutata su window all'interno del corpo della funzione. Ma questo è davvero specifico per JSVM. Ad esempio, dai uno sguardo a this v8-users message (e alla discussione correlata). Le cose sono un po 'più complicate dietro le quinte, ma guardi approssimativamente come descrivi all'utente.

2

Potrei (e probabilmente lo farò) sostenere che la specifica non richiede che l'oggetto globale sia un oggetto nativo. Le specifiche defines a native object come:

oggetto in un'implementazione ECMAScript cui semantica sono completamente definiti da questa specifica piuttosto che dall'ambiente host.

E il definition of a host object:

dell'oggetto fornito dall'ambiente host per completare l'ambiente di esecuzione di ECMAScript. definizione dell'oggetto

L'host potrebbe certamente essere applicato a window, è un oggetto fornita dall'ambiente host per completare l'ambiente di esecuzione di ECMAScript. Inoltre, la sua semantica non è completamente definita dalla specifica ECMAScript.

C'è anche il caso che i motori ECMAScript che girano nei browser, come V8, TraceMonkey, ecc., Non creano l'oggetto window. Piuttosto, è fornito dal DOM (costruito ed ereditato da DOMWindow o Window, per esempio).

+1

Ma l'oggetto 'window' * è * l'oggetto globale ECMAScript la cui semantica * è * completamente definita dalla specifica ... (Quando dico *' window' object *, non intendo la '" finestra " 'proprietà globale, ma l'oggetto a cui fa riferimento quella proprietà, che è l'oggetto globale.) L'ambiente host può aggiungere proprietà aggiuntive all'oggetto globale (come" finestra "," documento "," avviso ", ecc.), ma la sua semantica sono completamente definiti, no? –

+1

@ ŠimeVidas: Non penso che si possa dire che la semantica sia * completamente * definita dalle specifiche ECMAScript. In effetti, la semantica dell'oggetto 'window' è definita da [Specifica dell'oggetto Window] (http://www.w3.org/TR/Window/), inclusa la sua ereditarietà dall'interfaccia AbstractView. D'altra parte, hai fatto un'ottima domanda e sono persino aperto alla possibilità che io possa sbagliarmi. Dov'è Brendon Eich, quando hai bisogno di lui? ;-) –

+0

Ok, torniamo un po 'indietro. Nei browser, l'oggetto 'window' * è * l'oggetto globale ECMAScript, giusto? (Citazione dalla specifica: "* ad esempio, nel modello di oggetto documento HTML la proprietà' window' dell'oggetto globale è l'oggetto globale stesso * ".) –

Problemi correlati