Ci sono dei vantaggi nell'usare il prefisso 'finestra' quando si richiamano variabili o metodi javascript nell'oggetto della finestra? Ad esempio, chiamare "window.alert" ha un vantaggio semplicemente chiamando "alert"? Posso immaginare che l'uso del prefisso potrebbe dare un piccolo incremento di prestazioni quando la chiamata è fatta all'interno di qualche funzione/oggetto, tuttavia raramente lo vedo nel codice della gente. D'ora in poi questa domanda.Beneficio dell'uso del prefisso 'finestra' in javascript
risposta
Dubito che ci sia un beneficio misurabile in termini di prestazioni. Dopo che tutta la catena dell'ambito sarebbe stata scansionata per l'identificatore window
prima l'oggetto della finestra sarebbe stato scansionato per l'elemento desiderato. Quindi più probabilmente sarebbe deteritivo rispetto alle prestazioni.
L'utilizzo del prefisso finestra è utile se si dispone di un'altra variabile nell'ambito che nasconderebbe l'elemento che si desidera recuperare dalla finestra. La domanda è puoi sapere sempre quando potrebbe essere? La risposta è no. Quindi dovresti sempre prefissi con la finestra? Come faresti a codice se lo facessi. Brutta. Quindi non farlo a meno che non si sappia che è necessario.
Non avevo idea che la catena di portata sarebbe stata scansionata per la finestra! Ho sempre pensato che la finestra fosse una parola chiave riservata, e quindi non sarebbe successo. Grazie. –
La catena di portata funziona effettivamente al contrario. Le variabili locali sovrascrivono i globals. – superlukas
Immagino che il vantaggio prestazionale qui sia incredibilmente insignificante nel migliore dei casi, se ce n'è uno.
Importa solo se si utilizzano frame e si eseguono alcune chiamate javascript su frame e anche in questo caso solo scenari specifici giustificano la necessità di fare riferimento a window
in modo esplicito.
Quando si utilizza il prefisso, si rende esplicito che si sta utilizzando la definizione "globale" della variabile, non locale. (Non sono sicuro se/come sia possibile iniettare variabili in un ambito in JS, tranne la stranezza con questo e gestori di eventi in linea.) YMMV, potresti preferire la chiarezza, o trovare che sia solo una confusione.
Estratto da Google (http://www.techotopia.com/index.php/JavaScript_Window_Object):
L'oggetto window è l'oggetto di livello superiore della gerarchia degli oggetti. In quanto tale, ogni volta che un metodo o una proprietà oggetto viene fatto riferimento in uno script senza il nome dell'oggetto e il prefisso del punto, viene assunto da JavaScript come membro dell'oggetto finestra. Ciò significa, ad esempio, che quando si chiama il metodo window alert() per visualizzare una finestra di dialogo di avviso. il prefisso non è obbligatorio Pertanto le seguenti chiamate di metodo a raggiungere la stessa cosa:
window.alert()
alert()
Tuttavia, ho letto ma non hanno avuto il tempo di provare il seguente da: (http://www.javascriptref.com/reference/object.cfm?key=20)
Un posto che dovrai fare attenzione, però, è nei gestori di eventi. Poiché i gestori di eventi sono associati al documento, una proprietà Document con lo stesso nome di una proprietà Window (ad esempio, open) maschererà la proprietà Window. Per questo motivo, devi sempre usare la "finestra" completa. sintassi durante l'indirizzamento delle proprietà della finestra nei gestori di eventi.
+1 informativo =) –
Ciò è utile quando si tenta di verificare i valori globali dell'oggetto.Per esempio, se GlobalObject
non è definito allora questo genera un errore:
if(GlobalObject) { // <- error on this line if not defined
var obj = new GlobalObject();
}
ma questo non genera un errore:
if(window.GlobalObject) { // Yay! No error!
var obj = new GlobalObject();
}
Allo stesso modo con:
if(globalValue == 'something') // <- error on this line if not defined
if(window.globalValue == 'something') // Hurrah!
e:
if(globalObj instanceof SomeObject) // <- error on this line if not defined
if(window.globalObj instanceof SomeObject) // Yippee! window.prop FTW!
I w Non aspettatevi di vedere una significativa differenza di prestazioni, e l'unica altra ragione per cui potreste fare questo è assicurarsi che stiate effettivamente ottenendo un valore dall'ambito globale (nel caso in cui il valore sia stato ridefinito nell'ambito corrente).
Per quanto riguarda le prestazioni, penso che AnthonyWJones abbia coperto.
Un uso del prefisso della finestra è rendere esplicitamente disponibile qualcosa all'esterno dell'ambito corrente. Se si stesse scrivendo codice in una funzione di auto-invocare per evitare di inquinare la portata globale, ma c'era qualcosa dentro che si voleva rendere disponibile a livello globale, si potrebbe fare qualcosa di simile a quanto segue:
(function(){
function foo(){
//not globally available
}
function bar(){
//not globally available
}
window.baz = function(){
//is globally available
foo();
bar();
};
})();
'baz = function() {/ * ... * /}' fa lo stesso, e no, AnthonyWJones non ha coperto. Lo standard garantisce che ci sia un beneficio misurabile in termini di prestazioni (non solo in JS, ma anche in linguaggi come Lua), a causa del modo in cui funzionano gli ambiti. – superlukas
avviso è una cattiva esempio, perché in genere viene chiamato solo una volta e non importa (generalmente) il tempo necessario per la visualizzazione. – Nosredna