2012-06-19 14 views
10

Como ejemplo, ¿puedo usar la misma variable y parámetro? ¿Qué problemas puedo encontrar?¿Se permiten los mismos nombres de variables y parámetros en una función de JavaScript?

Código de ejemplo

function mytask(name,title){ 
      var name = name; 
      var title = title; 
      var showalert = ("Hi " + name + " your job title is " + title); 
      console.log(showalert); 
      return showalert; 
     } 

document.write(mytask("dan", "administrator")); 
+0

Si pudiera, ¿cómo se referiría a cada uno de ellos? – cheeken

+0

¿Quiere decir que puede usar los argumentos con nombre que está pasando a la función como los nombres de las variables en la función? Sí, sí puedes. ¿Has tenido algún problema con esto? –

+0

El código funciona. Sin embargo, no me gustaría mantener esto. –

Respuesta

5

bien en javascript se puede pensar que, alcances se definen mis llaves: { Y }, y dentro de unas variables de ámbito puede ser redefinido, por lo mire:

function x(){ 
    var name=3; 
    var name=4; 
    console.log(name); // output is: 4 
} 
x(); 

Pero esto es sólo una verdad a medias, de hecho, lo que ocurre es que el intérprete revisa el código y mueve todas las declaraciones var al principio, mientras se les asigna un undefined (y todos los argumentos se definen y toman de la pila), y luego se ejecutará el código que escribió. Entonces cualquier var después de la primera simplemente se ignora. Y el código que escribió es igual a:

function mytask(name,title){ 
    var name = arguments[0]; 
    var title = arguments[1]; 
    name = name; 
    title = title; 
    var showalert = ("Hi " + name + " your job title is " + title); 
    console.log(showalert); 
    return showalert; 
} 

document.write(mytask("dan", "administrator")); 

Por lo tanto, su desaceleración y asignación es redundante. De todos modos, el alcance no está cambiando, nada más será diferente.

Editar

El intérprete pasa sobre su código, con la ejecución de cualquier cosa, cualquier declaración var x = y; se dividirá en var x = undefined; y x=y;. Y el var x = undefined; se moverá a la parte superior del código. Y el x=y; estará en el mismo lugar que el enunciado original. Si no entendiste las cosas acerca de la pila, no te molestes, así es como los compiladores convierten las llamadas a funciones en ensamblajes; vale la pena saberlo en caso de que tengas tiempo; pero no lo importante aquí.

De todos modos, justo después de esos cambios, y tal vez se realizan algunas optimizaciones, se ejecuta el código resultante. Este no es el código que escribió, sino uno igual. Lo que señaló al redefinir los argumentos es un caso límite en el que estas transformaciones se vuelven visibles.

+0

¿Podría explicar lo que quiere decir con "mueve todos los enunciados var al principio, mientras están asignados como indefinidos (y todos los argumentos están definidos y tomados de la pila) y luego se ejecutará el código que escribió?" – PeanutsMonkey

+0

@PeanutsMonkey Ver edición –

+0

Está bien solo para entender claramente lo que quiere decir regurgitaré. Avísame si he entendido mal. Si tengo la función como en mi pregunta donde el parámetro y la variable comparten la misma declaración, quiere decir que el intérprete dividirá 'name = name' en' name = undefined' y 'name = name'. ¿Está bien? – PeanutsMonkey

1

Claro que puedes tener problemas. Mira esto.

function mytask(name,title){ 
      console.log(name); 
      console.log(title) 
      var name = "oops"; 
      var title = "rawr"; 
      console.log(name); 
      console.log(title) 
} 

mytask("dan", "administrator"); 

Aparte de ser muy confuso, llamando console.log(name); nos da dos resultados diferentes (ya que la redefinió). Está permitido, pero no es una buena idea hacerlo.

Edit: Curiosamente (no sabía esto), hacer lo anterior atornilla la matriz implícita arguments[] también. Por ejemplo, haciendo:

for(var i = 0; i < arguments.length; ++i) { 
    console.log(arguments[i]); 
} 

algún lugar dentro de nuestra función (después de la reasignación) todavía da salida a oops y rawr. Obviamente, esta es una mala, mala idea.

1

Puede usar variables con el mismo nombre que los parámetros, ya que el valor será el mismo de todos modos, a menos que la variable con el mismo nombre tenga un valor diferente al parámetro.

1

En realidad no hay ninguna razón para hacerlo. Una vez que los pasa a la función, se inicializan y puede usarlos sin reasignarlos a otras variables.

2

pensar de esta manera:

var name = name; 

La única manera name se puede establecer en el valor de name es decir, si es name ya definido. No es necesario hacerlo dos veces si name ya tiene el valor que desea.

2

Bueno, supongo que alguna explicación no hará daño.)

En primer lugar, todos los parámetros de la función ya están declarados como locales para esta función. (es un poco más complejo, pero digamos que esta explicación cubre la mayor parte). Entonces no sirve de nada volver a definirlos: no se volverán 'más locales' después de eso.))

En segundo lugar, es posible escribir var name = name en el function(name) por las mismas razones por las que es posible escribir var name = 123; var name = 345;. El segundo var se ignorará silenciosamente.

Y si escribe var name = 123; var name = name;, desperdiciará algunas teclas, ya que, de nuevo, es lo mismo que escribe name = name; en algún lugar de su código.)

Y eso, por cierto, explica ensuciar el arguments. Ver, name es en realidad un alias para su elemento.

+0

¿Qué quiere decir con "La segunda var será simplemente ignorar silenciosamente" y también explica el desorden de los 'argumentos'? – PeanutsMonkey

+0

¿Quiere que le explique cómo funciona el enganche con más detalle? – raina77ow

+0

@ raina77ow ¿Funcionará esto en modo 'estricto'? – Medorator

Cuestiones relacionadas