2011-07-31 12 views

Respuesta

41

No es nada más que un recordatorio de que si haces esto:

var x=5; 
var x; 
alert(x); 

resultado será 5.

Si re-establece la variable en algunos otros idiomas por ejemplo, el resultado no estará definido, o NaN, pero no en javascript.

+0

Interesante. Obtengo el mismo error cuando intento redeclarar una clase. Tuve una clase de Animal con una función de hablar genérica que se parece a 'console.log (this.name + 'hace un sonido.')'. Por supuesto, después de declararlo me di cuenta de que ''hacer 'necesitaba un espacio entre la cita y la palabra. Así que navegué hasta la entrada, lo arreglé y volví a enviarlo pensando que la nueva declaración sobrescribiría la anterior. Claramente, no es así como funciona JavaScript. Entonces, ¿cómo debería lidiar con esto? – Musixauce3000

18

¿Por qué debería volver a declarar una variable?

No debe. Crea un código confuso.

¿Es práctico en algunas situaciones?

No.

+0

Su respuesta es muy buena, pero tengo que elegir solo una para aceptarla. – xralf

+0

Es más como redeclarar una variable accidental o inconscientemente. – Adnan

+2

si tengo dos bucles no anidados en una sola función, y el 'var i = 0' declarado se usa solo en el bucle, donde fue declarado, ¿por qué debería importar otro nombre para el segundo bucle? Así que este es al menos un ejemplo, donde la redeclaración de variables es práctica, creo que – user907860

7

en Javascript no hay ámbito de bloque por lo que es recomendable redeclare una variable para fines de aclaración; esto hace un mejor código.

Por ejemplo:

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

alert(x); //In most languages, x would be out of scope here. 
      //In javascript, x is still in scope. 


//redeclaring a variable helps with clarification: 
var x = "hello"; 
alert(x); 
30

Un ejemplo de redeclarandolos una variable se pueden encontrar en Google Analytics. Cuando el código de seguimiento JavaScript es iniciado por la secuencia de comandos de Google Analytics, que declara o redeclares _gaq de esta manera:

var _gaq = _gaq || []; 

En otras palabras, si _gaq ya está definido, _gaq es "volver a declarar" como ella misma. Si no está definido, se declarará por primera vez como una matriz vacía.

Esto permite que el código de seguimiento de Google Analytics admita otros scripts que pueden necesitar utilizar la variable antes de que se inicie el código de Google Analytics. Como @xralf señaló, JavaScript lo permite.

La redefinición de una variable es útil en situaciones donde no se puede saber si la variable ya se ha definido.

Al redeclar una variable de forma condicional, como lo hace el código de seguimiento de Google Analytics, permite que una variable se origine con seguridad en más de un lugar.

En este ejemplo, podría ser seguro para otros códigos que utilizan la variable _gaq verificar también una variable predefinida _gaq. Si existe, sabe que puede usarlo. Si no existe, sabe que debe definirlo antes de intentar usarlo.

+0

Muy buena respuesta, +1, especialmente para la nota sobre permitir una variable para "originar de forma segura desde más de un lugar". Cuando refactoriza fragmentos JS en archivos separados y desea poder usar bits y piezas según sea necesario, ayuda a poder hacer exactamente lo que ha mencionado en el ejemplo '_gaq' (nombre de variable horrible, ¿no? ?). –

0

En general, se puede considerar un estilo incorrecto tener var asignaciones después de otras declaraciones debido al problema de izar (see here).Utilizando el "patrón var único" (see here), las redeclaraciones solo podrían ocurrir como en el ejemplo de Google Analtyics de Steve Oliver. Me refactorizar el ejemplo anterior para:

var x, max = 100; // no further var declarations afterwards! 

for (x = 0; x < max; x++) { } 

alert(x); 

// redeclaration 'var x = "hello"' doesn't make any sense here 
// and would be complained about by JSLint/-Hint 
x = 'hello'; 
alert(x); 

Un redeclaración puede tener sentido sin embargo, cuando se utilizan los valores por defecto para los parámetros opcionales (que es lo que el ejemplo de Google Analytics se trata, supongo):

function abc(param1) { 
    var param1 = param1 || 'default value'; 
} 
2

no pierde su valor debido a Hoisting

var x = 5; 
var x; 

// this is same as 

var x; // undefined; 
x = 5; 

Así, cuando decimos "Si redeclare un JavaScrip t variable, no perderá su valor ".

Según el levantamiento, la (s) declaración (es), todas ellas, se mueven a la cima. Y luego la variable está asignada.

var x = 25; 
var x; // redeclare first time 
var x; // redeclare second time 

// is same as 

var x; // undefined 
var x; // Not sure if this happens, but doesn't make a difference, it's still undefined 
x = 25; 

En cuanto a la practicidad, sucede a veces. Mire la respuesta de @steveoliver.

Cuestiones relacionadas