2012-07-20 23 views
14

Le variabili globali sono memorizzate in un oggetto specifico? Per esempio:In quale oggetto sono memorizzate le variabili globali di Javascript?

var test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 

Tutti e tre di questi test risultato in undefined, così c'è un oggetto che contiene queste variabili?

Mi sento come se fosse qualcosa di stupido che dovrei già sapere, ma non riesco nemmeno a trovare la risposta online.

+3

Risposta breve: il modo in cui si fa riferimento alla variabile globale dipende dal proprio ambiente. –

+1

Cosa intendi esattamente per "ambiente"? Il browser, l'ambito, il sistema operativo? – twiz

+0

JavaScript può essere eseguito nei browser, in Adobe Photoshop, nei vecchi browser VRML, all'interno di motori che è possibile incorporare nei programmi Java e in molti altri sistemi host. Li chiamiamo "ambienti host". Quindi sì, potrebbe essere un browser. I programmi JavaScript manipolano oggetti da questi ambienti. –

risposta

15

Penso che troverete sulla maggior parte dei browser, essi sono memorizzati in window.

Tentativo di debug psichico inverosimile: hai provato questo in jsFiddle? O forse in Firebug? Se è così, probabilmente stai vedendo undefined per tutti e tre perché in quel caso il codice viene eseguito in un frame; quindi ha un diverso window oggetto (credo) il codice è in realtà avvolto:

window.addEvent('load', function() { 
    var test="stuff"; 
    console.log(window.test); 
    console.log(document.test); 
    console.log(this.test); 
}); 

Si può vedere dal frammento di sopra da jsFiddle che test è non una variabile globale, il che spiega il motivo per cui hasn' t stato allegato a window.

Non sono esperto, ma questa risposta sembra essere accurata da quello che posso dire in Chrome, Firefox, Safari e Opera. Per verificare, ho creato un file HTML con il seguente contenuto e caricato in ogni browser: basta

<script type="text/javascript"> 
    var test = "stuff"; 
    alert(window.test); 
</script> 

Certo, "roba" ogni volta.

+0

Sapevo che c'era una ragione per cui pensavo "questo è qualcosa di stupido che dovrei già sapere". Hai perfettamente ragione, stavo usando jsFiddle ... Grazie per avermi indicato nella direzione della mia stessa stupidità. haha – twiz

+3

Lungi dall'essere stupido, quella era una buona domanda. –

+0

Sono con Ray; è sicuramente una buona domanda. In effetti è un po 'bizzarro più ci penso che questa risposta è in realtà vera. –

5

Una variabile globale "vera" non ha la parola chiave "var". Prova questo:

test="stuff"; 
console.log(window.test); 
console.log(document.test); 
console.log(this.test); 

Con questo, tutti gli ambiti lo vedrà. Le variabili con la parola chiave var sono locali rispetto all'ambito in cui sono state dichiarate.

Una variabile sarà "globale per finestra" (proprietà dell'oggetto finestra) solo se lo si dichiara nello scope della finestra come ha detto Dan, rendendolo globale ai browser che di solito utilizzano la finestra come ambito globale.

+1

Un "vero" globale? Se usi 'var' nello scope globale, crea una variabile globale. – nnnnnn

+0

@nnnnnn L'uso delle virgolette è stato intenzionale;) – davidbuzatto

+0

Interessante. Ho provato questo in jsfiddle, e invece ho ottenuto "stuff", "undefined", "stuff". E il primo e l'ultimo sono gli stessi perché 'this === window'. http: // jsfiddle.net/5Xtaq/1/ –

2

Le variabili globali sono memorizzate nella variabile globale window. Il seguente codice funziona solo se si dichiara fuori nulla (come una funzione):

var test="stuff"; 
console.log(window.test); 

analoga prova è che window.location.href è lo stesso di location.href

Tuttavia, il problema potrebbe risiedere su cui è stata dichiarata la variabile . Ad esempio, se hai dichiarato questa variabile in funzione, esisterà solo nella funzione, e non a livello globale:

function foo(){ 

    //declaring inside function 
    var test="stuff"; 

    //undefined, since the variable exists in the function only 
    console.log(window.test); 

    //undefined, document refers to the document 
    //which is the top DOM object, not the global window 
    console.log(document.test); 

    //depends on what "this" refers to, especially 
    //when using call() or apply() to call the function 
    //For normal function calls, usually it points to window as well 
    console.log(this.test); 

    //none of the above refer to "test" that contains "stuff" 
    //because you are looking in the wrong place 

} 
+0

È la parola chiave 'var', [@davidbuzatto] (http://stackoverflow.com/a/11573012/143295) aveva un buon occhio. – Nicole

17

Ecco una risposta in ritardo, ma tecnica.

vi chiediamo

sono variabili globali memorizzati in oggetto specifico?

La risposta è sì; sono memorizzati in qualcosa chiamato, ufficialmente, l'oggetto globale. Questo oggetto è descritto nella Sezione 15.1 di official ECMAScript 5 Specification.

L'oggetto globale non è necessario per avere un nome; ma è possibile fare riferimento alle sue proprietà, ad esempio String, isNaN e Date semplicemente utilizzando il loro nome. L'ambiente host JavaScript posizionerà altre proprietà nell'oggetto globale oltre a quelle richieste dalle specifiche ECMAScript, come ad esempio alert o console. In un browser, posso scrivere la sceneggiatura

alert("Hello world"); 

perché alert è una proprietà dell'oggetto globale.

Nota che non ci deve essere un modo per accedere a questo oggetto globale affatto, che ci crediate o no. La cosa interessante, tuttavia, è che molti ambienti host inseriranno una proprietà nell'oggetto globale il cui valore è un riferimento all'oggetto globale stesso. Nella maggior parte dei browser Web, questa proprietà è denominata window. Così possiamo scrivere:

alert("Hello"); 
window.alert("Hello"); 
window.window.alert("Hello"); 
window.window.window.window.window.alert("Hello"); 

e si può anche dire:

var x = 5; 
alert(this.x); 

e ottenere 5 allertati.

Problemi correlati