2009-04-26 20 views
22

¿Cuál es la diferencia entre:Ámbito de la variable en Javascript para el bucle

function bar() 
{ 
    for (x=0; x< 100; x++) {} 
} 

Y

function bar() 
{ 
    var x; 
    for (x=0; x< 100; x++) {} 
} 

Si x no fue declarado fuera de esa función, por lo que no era una variable global? Siempre me pregunto esto porque, en general, no declaro las variables desechables que se usan solo en un ciclo, pero me pregunto si esto podría romper la comparabilidad en un navegador o algo así.

Respuesta

34

El primer ejemplo agregará o modificará la variable global x, que generalmente debe evitarse si no es el resultado deseado.

Mientras que el segundo ejemplo funciona como (sin efectos secundarios) deseados una alternativa que se ve mejor en mi opinión sería

function bar() 
{ 
    for (var x=0; x< 100; x++) {} 
} 
+0

Cualquier variable no declarada con "var" siempre será una variable global. Aquí está la entrada MDC en var: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Statements/Var – cdmckay

+16

Puede que se vea mejor, pero JavaScript no tiene alcance de bloque, por lo tanto, no importa si declara 'x' dentro o fuera del ciclo 'for'. (JS 1.7 introduce la palabra clave 'let', mira la respuesta de noha.) –

+2

+1 para siempre agrega la var. He visto muchos casos en los que un ciclo que usa 'i' llama a una función con su propio bucle usando 'i', donde ambos actualizan una 'i' global. En algunos casos, puede pasar desapercibido pero ensuciar completamente las cosas en otros. – scunliffe

16

Una variable se crea en el momento de declarar/usarlo. Si omite la palabra clave var, la variable se crea automáticamente en el ámbito global. Entonces produces un efecto secundario. Esto generalmente se debe evitar.

Supongamos que utiliza variables globales y luego elige el nombre de la variable que alguna otra parte del software ya ha tomado. Esto conducirá a una situación en la que los fragmentos de código sobrescriben sus valores. Esto produce errores y la mayoría de las veces es difícil de depurar. En su ejemplo, es posible que sobrescriba una variable global x que está utilizando otro software.

El uso de var es también más rápido. Si accede a una variable global, debe escanear todos los ámbitos hasta el global para el nombre de la variable. Al usar var, está ligado a su alcance local.

Es una buena práctica usar siempre use var. O mejor: siempre es bueno seleccionar el alcance más estrecho para sus variables. Ahora tienes globales y var. Una declaración var es visible en toda la función, sin importar dónde la declare. En javascript 1.7, se introdujo una nueva palabra clave: let. Vamos a reducir el alcance aún más. Si declara su bucle for con

for(let x = 0; x < 100; i++) {} 

que x es visible solo dentro del {} bloque.

+0

¿Es 1.7 en la mayoría de los navegadores ahora? –

2

Recuerde siempre que, en JavaScript, los ámbitos están definidos por funciones. En el ejemplo

function() { 
    var x = 15; 
    bar(); 
    function bar() { 
     for (x=0; x< 100; x++) {} 
    } 
    //here x will be 100 
} 

Es posible acceder accidentalmente a un ámbito superior. Lo que quiero decir con mayor alcance es una función de envoltura o window.x (si no hay más funciones de envoltura). Es mucho mejor seguir el segundo ejemplo si solo quieres usar x para tu ciclo.

function() { 
    var x = 15; 
    bar(); 
    function bar() { 
     var x; 
     for (x=0; x< 100; x++) {} 
    } 
    //here x will be 15 
} 
Cuestiones relacionadas