2011-06-09 23 views
5

Duplicar posible:
JavaScript Variable Scope¿Cuándo uso var?

Mi entendimiento es que, con una función de si uso var entonces tengo una variable local. Si no guardo var, ahora tengo una variable global.

Pero, ¿qué pasa con el derroche de funciones, qué efecto tiene var?

Respuesta

8

En primer lugar, generalmente es una mala práctica usar código fuera de las funciones. Por lo menos, envolver el código en funciones anónimas:

(function(){ 
    // code 
})(); 

En cuanto a lo var efecto tiene, que "declara" una variable:

var foo; 
alert(foo); // undefined; 

vs:

alert(foo); // error: foo is not defined 

La razón para esto es que el código anterior es funcionalmente idéntico a:

alert(window.foo); 

sin declarar la variable con var, se obtiene un error de búsqueda, lo mismo que intentar acceder a la propiedad de cualquier objeto que no existe.

Tenga en cuenta que una de las singularidades de la var es que todas las declaraciones son empujados a la parte superior de la secuencia de comandos, así que esto va a funcionar así:

alert(foo); // undefined 
var foo; 

También tendrá acceso a la variable en el window objeto (aunque también puede tener esta estableciendo la variable sin var, por ejemplo, acaba de foo=42):

var foo; 
for(var key in window){ 
    // one of these keys will be 'foo' 
} 
+0

Esto "La razón para esto es que el código anterior es funcionalmente idéntico a:' alert (window.foo); '" está muy mal. Pruebe esto: http://jsfiddle.net/zeKhL/ –

+1

@ c-smile: no está mal. jsfiddle ajusta el código en una función anónima de forma predeterminada. http://jsfiddle.net/cwolves/zeKhL/1/ –

+0

@Chris: en muchos casos, no importa fuera de las funciones. El caso más simple donde lo hace es simplemente tener el código 'if (some_var) {' donde obtendrá un error "some_var no está definido" si la variable nunca se estableció O se declaró con 'var' –

0

Creo que usar var fuera de una función funciona igual que no usar var: obtienes un global. La excepción a esto sería si está en una clase u otra estructura de espacio de nombres, en la que aún definirá una variable en esa configuración regional

0

Creo que desea crear una var siempre que esté inicializando una variable. Como he codificado, cuando necesito inicializar una variable, la comienzo con var. Si declaras una variable sin la palabra var, siempre es global. Si declara una variable con var, dentro de una función, es local para esa función. Si crea una variable con var funciones externas, será una variable global.

0

Si declara una variable global y establece un valor que no tendrá ningún valor práctico, pero como se mencionó, es una mejor práctica. Sin embargo, si desea declarar una variable sin un valor, necesitará "var".

1

Su pregunta se responde en https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var

Usando var fuera de una función es opcional; asignar un valor a una variable no declarada implícitamente lo declara como una variable global. Sin embargo, se recomienda siempre uso var, y es necesaria dentro funciones en las siguientes situaciones:

  • Si una variable en un ámbito que contiene la función (incluyendo el alcance global) tiene el mismo nombre.
  • Si las funciones recursivas o múltiples usan variables con el mismo nombre y> intentan que esas variables sean locales.

no declaración de la variable en estos casos lo más seguro signifique a resultados inesperados.

6

Es una buena práctica siempre uso var. Estrictamente hablando, cuando ya se encuentra dentro del alcance global, no es necesario, sino por el mantenimiento del código, debería hacerlo.

Digamos que tienes:

foo = 'bar'; 

Pero más tarde decide que desea mover este código en una función:

function doSomething() { 
    foo = 'bar'; // oops forgot to add var 
} 

Si se olvida de añadir una declaración var que acaba de crear una implícito global. Ahora, si crea un nuevo objeto en el ámbito global que se llama foo, causará conflictos entre sí.

function doSomething() { 
    foo = 'bar'; // Implicit global 
} 

foo = 'baz'; 
doSomething(); 
console.log(foo); // Returns 'bar', not 'baz' 

Este tipo de error es particularmente insidioso cuando se olvida de usar var en algo como i en un bucle for. Aprender a usar JSLint puede ayudar a evitar estos y otros errores lógicos o de sintaxis problemáticos.

+1

+1 para analizar el ángulo de mantenimiento del código. Incluso si el código sin 'var' es 100% libre de errores hoy, será más fácil de entender cuando vuelva el próximo mes si sabe que sigue la rutina de siempre usar' var'; de lo contrario, cuando vea 'foo = ' bar'' tienes que buscar en otro lugar para averiguar si 'foo' ya fue declarado o configurado en algún otro valor, etc. – nnnnnn