2015-10-23 10 views
6

Mentre aggiungevo un codice di inizializzazione a una pagina web, mi sono trovato a scrivere window.onload = ... per l'ennesima volta, quando un pensiero mi colpì.Perché scriviamo la finestra?

Il window. non è necessario, perché window è l'oggetto corrente. Quindi è opzionale!
Ma nessuno scrive solo onload = ... e mi chiedo perché sia ​​così.

Voglio dire, non abbiamo remore a scrivere altre cose, ad esempio alert senza il qualificatore window..

window.onload = function() { 
    alert('Your window has loaded'); 
}; 

mentre in realtà, alert è altrettanto un metodo dell'oggetto window come onload è.
Quindi, perché la differenza? Perché anche siti web formali come lo W3C fanno questo?

+14

È * esplicito *, quindi nessuno pensa che tu stia semplicemente assegnando accidentalmente una variabile globale. – Bergi

+0

Mi piace questo argomento, in quanto spiega la differenza. Assegnare qualcosa a una variabile vs chiamare una funzione - non è possibile creare una nuova funzione semplicemente chiamandola, quindi è chiaro che la funzione esiste già da qualche parte. –

+0

@Bergi Puoi pubblicare questo come una risposta? Penso che questo sia ancora l'argomento più convincente. –

risposta

0

Scriviamo window. quando vogliamo essere espliciti a riguardo. Ci sono fondamentalmente due casi in cui questa è la buona forma di usarlo:

  • proprietà ei metodi della window oggetto - tutto ciò che fa parte del Window interface. Il listener .onload che hai citato è un esempio di questo, cose come window.scrollY, window.status, window.parent, window.open(), window.focus(), window.removeEventListener() sono altri.
  • creazione di proprietà globali. Assegnare a window.myGlobalVar da qualsiasi ambito è un idioma JS comune per creare una "variabile" globale. Certo, è comunque meglio dichiararlo esplicitamente con var.

Mentre potremmo "opzionalmente" omettere la parte window. qui, è raro. Soprattutto la creazione di implicitly global variables attraverso l'incarico è disprezzata e solitamente vista come un errore. Quindi, se lo fai apposta, dichiari la tua intenzione usando window..

Tuttavia, il primo caso non è sempre ben definito. Spesso omettiamo la parte window. quando la proprietà che vogliamo utilizzare è essenzialmente una variabile statica, globale e non necessariamente correlata all'oggetto window anche se è formalmente specificata su di esso. Si vede raramente qualcuno usando document, atob(), Worker, setTimeout() o fetch() con il prefisso window., proprio come non si utilizza window.JSON.parse o window.Array per il oggetti incorporati (anche se sarebbe valida).

Per alcuni altri immobili come navigator, location o alert() non è sempre chiaro, e quelli sono utilizzati forse cinquanta per cento, senza o meno.

5

vedo seguenti motivi:

  1. Ridurre la ricerca il ambito catena migliorerà le prestazioni po. Ciò si vede anche nell'IFE, dove window viene inviato come parametro alla funzione e al suo interno viene utilizzato il riferimento locale alla finestra.
  2. Se la funzione/membro definita su window a livello globale è esclusa nell'ambito, allora non funzionerà come previsto, quindi fare riferimento in modo esplicito fa riferimento alla funzione/membro corretta. Ciò è utile per creare la funzione/membro con lo stesso nome di quello globale e ancora in grado di accedere al membro globale dall'ambito ombreggiato.
+1

OK, ma perché la differenza? Perché non tutti scrivono 'window.alert' invece di' alert', che migliorerebbe anche le prestazioni? –

+0

@MrLister check 'function onload() { // Codice Here } onload = qualcosa;', qui 'onload' non funzionerà come previsto. E come spiegato da Andre nella risposta, 'onload' non è solo limitato a' window', può essere applicato a 'img', 'iframe', ecc. In modo che sia esplicitamente aggiunto sulla finestra. In caso di 'alert' non è la funzione _critical_, anche quando è sovrascritta non danneggia il codice (al contrario di' onload'). – Tushar

2

Perchénon è esclusivo di window. Può anche essere utilizzato, ad esempio, come document.onload. Quindi lo definisci a seconda di quando vuoi che lo script venga eseguito.

+0

OK, ma perché la differenza? Perché non tutti scrivono 'window.alert' invece di' alert', che non è esclusivo? –

-1

l'oggetto finestra viene inizializzato di default dal browser. È una buona pratica per definire esplicitamente l'oggetto window effect sulle prestazioni & il tuo codice diventerà comprensibile.

Problemi correlati