¿Se permiten los mismos nombres de variables y parameters en una function de JavaScript?

Como ejemplo, ¿puedo usar la misma variable y parámetro? ¿Qué problemas puedo encontrar?

Código de muestra

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")); 

Bueno, en Javascript, puedes pensar que los ámbitos se definen con mis llaves: { Y } , y dentro de un ámbito, las variables se pueden networkingefinir, así que mira:

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

Pero esto es solo la mitad de verdad, en realidad lo que sucede es que el intérprete revisa el código y mueve todas las declaraciones var al principio, mientras que se les asigna un undefined (y todos los arguments se definen y toman de la stack), y luego El código que escribió se ejecutará. 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")); 

Entonces su re-desaceleración y asignación es networkingundante. De todos modos, el scope no está cambiando, nada más será diferente.

Editar

El intérprete repasa su código, con la ejecución de cualquier cosa, cualquier var x = y; la statement se dividirá en var x = undefined; y x=y; . Y var x = undefined; se moverá a la parte superior del código. Y el x=y; estará en el mismo lugar que la statement original. Si no entendiste las cosas acerca de la stack, no te molestes, así es como los comstackdores convierten las llamadas a funciones en ensamblajes; vale la pena saberlo en caso de que tengas time; 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 networkingefinir los arguments es un caso límite en el que estas transformaciones se hacen visibles.

Piensa en ello de esta manera:

 var name = name; 

La única forma en que el name se puede establecer en el valor del name es si el name ya está definido. No es necesario hacerlo dos veces si el name ya tiene el valor que desea.

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

Primero, todos los parameters de la function ya están declarados como locales para esta function. (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 dentro de la function(name) por las mismas razones por las que es posible escribir var name = 123; var name = 345; var name = 123; var name = 345; . La segunda var será ignorada silenciosamente.

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

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

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"); 

Además de ser muy confuso, llama a console.log(name); nos da dos resultados diferentes (porque lo hemos networkingefinido). Está permitido, pero no es una buena idea hacerlo.

Editar : Curiosamente (no sabía esto), hacer lo anterior también altera la matriz de arguments[] implícitos arguments[] . Por ejemplo, haciendo:

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

en algún lugar dentro de nuestra function (post-reasignación) sigue produciendo oops y rawr . Obviamente, esta es una mala, mala idea.

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

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