A continuación, tengo 2 ejemplos, con la única diferencia de que una función tiene un parámetro mientras que la otra no. Pero el Ejemplo 1 registrará un hello en la consola, mientras que el Ejemplo 2 registrará un hello! a la consola
Mi pregunta es ¿por qué el Ejemplo 1 registra hello mientras que el Ejemplo 2 registra hello! .
Ejemplo 1, no estoy seguro de lo que está pasando. Mi conjetura es que en el Ejemplo 1 estamos usando sombreado variable. El parámetro de greet se inicializa en una cadena primitiva hello . El parámetro de greet sombrea el greet de la línea 1. Por lo tanto, cuando registramos greet en la consola, estamos registrando el greet desde el ámbito global, hello .
No estoy seguro pero, en el Ejemplo 2, la función salutation se invoca con el argumento 'hello' . Luego, la variable global greet se reasigna al valor de 'hello' + '!' . Por lo tanto, cuando se registra greet en la consola, estamos registrando el valor al que se reasignó greet , hello! .
¿Por qué la falta de un parámetro de greet en la función nos permite registrar el valor reasignado a la consola? Pero cuando la función tiene un parámetro, ¿registramos la variable global en la consola?
Ejemplo 1.
let greet = 'hello'; function salutation(greet) { greet = greet + '!'; } salutation(greet); console.log(greet); //helloEjemplo 2.
let greet = 'hello'; function salutation() { greet = greet + '!'; } salutation(greet); console.log(greet); //'hello!'El argumento de la función se copia por valor , por lo que el greet (global) y el greet (local) son completamente diferentes. Con la línea de abajo, greet es una copia de la variable global y solo está disponible dentro de la función, por lo tanto, local.
function salutation(greet) { greet = greet + '!'; }¿Por qué la falta de un parámetro de
greeten la función nos permite registrar el valor reasignado a la consola? Pero cuando la función tiene un parámetro, ¿registramos la variable global en la consola?
Ambos ejemplos registran la variable global en la consola.
Es solo que en el primer fragmento, hay una variable de greet local que se reasigna, mientras que en el segundo fragmento no hay una variable local y asigna (y accede) a la variable global de greet través del cierre.