2012-02-13 12 views
7

Non ho fatto seriamente la programmazione JavaScript in un istante, e sto scrivendo una guida introduttiva alla lingua per alcuni dei miei colleghi. Mi piacerebbe discutere le best practice del ciclo, ma c'è un piccolo dettaglio che ho tenuto nella parte posteriore della mia mente:JavaScript "per (var i = 0; ...) {...}" incompatibilità del browser?

Durante il loop su array, ricordo che il seguente schema non è sicuro da usare perché ci sono i principali browser che non lo supportano:

for (var i = 0; i < ls.length; i++) { ... } 

invece, la parola chiave var deve essere spostato fuori della matrice, come ad esempio:

var i; 
for (i = 0; i < ls.length; i++) { ... } 

è corretto? Ho setacciato la rete e non posso confermarlo. Alcuni vecchi browser non supportano il primo metodo? Se no, quali no?

+3

Io personalmente non riesco a pensare a nessun browser in cui il primo esempio potrebbe fallire. –

+1

Nessun browser di uso comune nel 2012 non supporta nessuno di questi. Sono esattamente uguali. (Quando dico "uso comune" intendo usato da più di uno o due casi periferici, forse qualcuno sta eseguendo Netscape 3 da qualche parte, ma si ottiene l'immagine. E Netscape 3 probabilmente ha funzionato.) – Pointy

+0

quanti anni hai intenzione di ottenere? Stiamo parlando di Netscape e IE3 o ti stai riferendo ai tempi di IE7? – webdad3

risposta

12

"È corretto?"

A meno che non stiamo parlando di alcuni davvero, davvero browser vecchio, io non sono a conoscenza di tale problema con il browser in uso oggi.


L'unico problema che le persone hanno con probabilità il primo esempio è che si può confondere qualcuno a pensare che JavaScript ha blocco portata, cosa che fa non La situazione è cambiata da quando ES6, che ha portata blocco .

In entrambi gli esempi, la variabile i sarà portata all'ambiente variabile in allegato, indipendentemente dal fatto che l'ambiente di chiusura sia una funzione o l'ambiente globale.

7

Invece, la parola chiave var deve essere spostato fuori della matrice

Non

necessariamente. Il punto è che NON bisogna dimenticare la parola chiave var prima del i altrimenti diventerà variabile globale. Quindi va bene se lo fai:

for (var i = 0; i < ls.length; i++) { ... } 

È possibile migliorare il prestazioni di codice di cui sopra con la creazione di un variabili che sostiene che la lunghezza dell'array/collezione piuttosto che leggere di nuovo e di nuovo con ogni iterazione:

for (var i = 0, len = ls.length; i < len; i++) { ... } 

BTW non preoccuparti del browser, quel ciclo dovrebbe funzionare in tutti i browser :)

+0

Off-topic, ma questa non è la prima volta che ho sentito che memorizzare la lunghezza in una variabile è un'importante ottimizzazione. Cosa fa il browser sotto il cofano? Penserei che la lunghezza dovrebbe essere una ricerca costante di tempo, non qualcosa che è calcolato, mai. – thebossman

+2

@thebossman: in JavaScript, tutto è un oggetto. Nel ciclo l'array che usi è anche un oggetto. Mentre si trova nel ciclo, il suo valore viene letto di nuovo e di nuovo ad ogni iterazione, ad esempio JS accede alla proprietà dell'array con ogni iterazione che impiega più tempo rispetto alla creazione di una variabile e all'assegnazione della lunghezza ad essa. Ovviamente, per la maggior parte degli utenti o delle app, questo non è un gran problema, ma per le app orientate alle prestazioni o massive, diventa un passaggio cruciale. – Sarfraz

+0

@thebossman: Sì, ma devi cercarlo spesso. Memorizzarlo in una variabile locale significa accesso ancora più veloce. –

0

Supponendo che tu non stia supportando alcun browser più vecchio di IE6, questo non dovrebbe essere un problema.

+0

Né in IE 3.02 né Netscape 2.0 – mplungjan

0

Non che avete chiesto, ma è possibile utilizzare jQuery per fare questo nel modo seguente:

$.each(ls, function(i,value){ 
... 
}); 
0

JavaScript dichiara in realtà ambito a livello funzione non bloccare portata. Le variabili dichiarate sono issate in cima alla loro funzione. Quello che sto dicendo è che i tuoi esempi sono in realtà identici.Anche con la parola chiave var all'interno dell'istruzione for, la variabile i sarà accessibile al di fuori del ciclo.

L'unica cosa da tenere a mente è se si omette la var la variabile sarà globale anziché limitata alla funzione.

0

ha urtato questo oggi

for(var i=0; i < t; i++) { 
//do whatever 
} 

mia JScript era in un file XSL chiamato da un file html - ha funzionato bene in IE, ma non su altri browser - il codice potrebbe andare in crash e non compare alcuna indicazione

fortuna potrei cambiare a, che ha lavorato per tutti i browser testati

for(var i=0; i != t; i++) { 
do whatever} 

anche essere consapevoli dei https://support.microsoft.com/en-us/help/273793/how-to-include-client-side-script-functions-in-an-xsl-document

Problemi correlati