2012-02-13 15 views
7

No he hecho una programación de JavaScript seria en un tiempo, y estoy escribiendo una guía de introducción al idioma para algunos de mis colegas. Me gustaría analizar las mejores prácticas de bucle, pero hay un pequeño detalle que he guardado en la parte posterior de mi cabeza:JavaScript "for (var i = 0; ...) {...}" incompatibilidades del navegador?

Al hacer un bucle sobre matrices, recuerdo que el siguiente patrón no es seguro de usar porque hay grandes los navegadores que no soportan:

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

En cambio, la palabra clave var debe moverse fuera de la matriz, tales como:

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

es esto correcto? Revisé la red y no puedo confirmarlo. ¿Algunos navegadores antiguos no son compatibles con el primer método? Si no, ¿cuáles no?

+3

Personalmente, no se me ocurre ningún navegador en el que falle el primer ejemplo. –

+1

Ningún navegador de uso común en 2012 no admite ninguno de estos. Son exactamente lo mismo. (Cuando digo "uso común" me refiero a usado por más de uno o dos casos periféricos, tal vez alguien está ejecutando Netscape 3 en alguna parte, pero se da cuenta y Netscape 3 probablemente funcionó) – Pointy

+0

¿Qué edad busca obtener? ¿Estamos hablando de Netscape e IE3 o se refiere al marco de tiempo de IE7? – webdad3

Respuesta

12

"¿Es esto correcto?"

A menos que estamos hablando de un muy, muy antigua del navegador, no estoy al tanto de cualquier problema con los navegadores utilizados en la actualidad.


El único problema las personas les queda con el primer ejemplo es que puede confundir a alguien a pensar que Javascript ámbito de bloque, lo que lo hace no Esto cambió desde ES6, que tiene ámbito de bloque .

En cualquiera de los ejemplos, la variable i se definirá en el entorno variable envolvente, independientemente de si el entorno envolvente es una función o del entorno global.

7

En cambio, la palabra clave var debe moverse fuera de la matriz

No necesariamente

. El punto es que NO se debe olvidar la palabra clave var antes de i de lo contrario se convertirá en variable global. Por lo que está bien si lo hace:

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

se puede mejorar la rendimiento de código anterior mediante la creación de unas variables que sostiene que la longitud de la matriz/recogida en lugar de leer una y otra vez con cada iteración:

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

Por cierto no se preocupe por el navegador, ese bucle debería funcionar en todos los navegadores :)

+0

Fuera del tema, pero esta no es la primera vez que escucho que almacenar la longitud en una variable es una optimización importante. ¿Qué está haciendo el navegador debajo del capó? Creo que .length debería ser una búsqueda de tiempo constante, no algo que se calcula, nunca. – thebossman

+2

@thebossman: en JavaScript, todo es un objeto. En el ciclo, la matriz que usas también es un objeto. Mientras está en el bucle, su valor se lee una y otra vez con cada iteración, por ejemplo, JS accede a la propiedad de la matriz con cada iteración, lo que lleva más tiempo que crear una variable y asignarle longitud. Por supuesto, para la mayoría de los usuarios o aplicaciones, esto no es un gran problema, pero para aplicaciones masivas o orientadas al rendimiento, se convierte en un paso crucial. – Sarfraz

+0

@thebossman: Sí, pero debes buscarlo a menudo. Almacenarlo en una variable local significa un acceso aún más rápido. –

0

Suponiendo que no admite navegadores anteriores a IE6, esto no debería ser un problema.

+0

Ni en IE 3.02 ni Netscape 2.0 – mplungjan

0

No es que tú lo has querido, pero se puede utilizar jQuery para hacer esto de la siguiente manera:

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

JavaScript realidad declara ámbito de nivel de función no bloquear alcance. Las variables declaradas se elevan al principio de su función. Lo que estoy diciendo es que tus ejemplos son realmente idénticos.Incluso con la palabra clave var dentro de la instrucción for, se puede acceder a la variable i fuera del ciclo.

Lo único que debe tener en cuenta es que si omite el var, la variable será global en lugar de limitarse a la función.

0

topamos con esto hoy

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

mi JScript estaba en un archivo XSL se llama desde un archivo html - funcionó bien en IE, pero no en otros navegadores - código se estrellaría y nada muestra

afortunadamente podría cambiarlo a, que trabajaron para todos los navegadores probados

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

también ser conscientes de https://support.microsoft.com/en-us/help/273793/how-to-include-client-side-script-functions-in-an-xsl-document

Cuestiones relacionadas