2012-01-27 12 views
8

Ogni proprietà dell'oggetto window è una variabile globale. Ciò significa che è possibile fare qualcosa di simile:Qual è lo scopo del riferimento all'oggetto finestra in Javascript?

window.foo = 42; 
alert(foo); //alerts 42 
var bar = 3; 
alert(window["bar"]); //alerts 3 

A causa di questo, mi sono sempre chiesto quale sia lo scopo era referenziare window in codice come questo

if(window.prompt("Enter Password") === "secret") { 
    window.location.hash = "authorized"; 
    window.open("secretPage.html"); 
} 

quando si poteva omettere window e hanno codice che fa esattamente la stessa cosa:

if(prompt("Enter Password") === "secret") { 
    location.hash = "authorized"; 
    open("secretPage.html"); 
} 

Anche l'uso sembra incoerente; Non vedo quasi mai window.alert ma vedrò spesso window.location.

Alle persone piace solo fare riferimento a window per rendere più dettagliato il loro codice? C'è qualche buona ragione per farlo che non conosco?

+0

'window' è solo una proprietà dell'oggetto globale. – Saxoier

+0

... che punta a se stesso. – Saxoier

+1

Che è interessante, perché significa 'finestra === window.window.window.window.window.window' –

risposta

5

Una situazione in cui aiuta essere espliciti è che sarà immediatamente chiaro all'interno di una funzione che si intende modificare una variabile globale. Per esempio:

function blah() { 
    // a bunch of code preceding... 
    test = "aha!"; 
} 

Soggetto con dimenticare di dichiarare test con var? O è questa modifica intenzionale di un globale? Confronta:

function blah() { 
    // a bunch of code preceding... 
    window.test = "aha!"; 
} 

Ora è immediatamente chiaro cosa è destinato. Certo, sai, i globals dovrebbero essere evitati in primo luogo, ma ottieni il mio punto.

1

finestra è implicita, ma è buona pratica del codice per evitare l'ambiguità ove possibile.

+1

Sarebbe bene evitare l'ambiguità, ma non sono sicuro di vedere come potrebbe essere ambiguo. –

+0

supponi di aver scritto una funzione "aperta" che ha fatto qualcosa di diverso dall'apertura di una nuova finestra? O forse un file js alieno che hai importato ha inquinato il tuo spazio dei nomi globale .. allora stai meglio usando riferimenti completi. –

+1

Se hai fatto una variabile globale 'var open = 3;' e hai provato a fare 'window.open()' causerebbe un errore perché 'window.open' è stato sovrascritto. I file js alieni che inquinano lo spazio dei nomi globale cambieranno il comportamento previsto indipendentemente dal fatto che si utilizzi 'open' o' window.open'. –

2

Penso che sia generalmente utilizzato per evitare potenziali conflitti con altre variabili in una chiusura chiusa. Inoltre, i correttori di stile come jslint generano errori se si accede a proprietà globali senza un oggetto esplicito (eccetto per proprietà note come window).

Detto questo, in un browser, quando si entra in più finestre, ad es. con iframe, ecc., potrebbe essere necessario passare esplicitamente attorno ad un riferimento all'oggetto finestra. (E se davvero ti interessano i dettagli, l'oggetto finestra, o almeno i riferimenti ad esso, sono molto speciali e non possono nemmeno essere descritti in javascript standard.)