function name(){ var fullName = "lawrence Turton"; function concat(name){ return "Hello Mr. " + name; }; return concat(fullName); }Actualmente estoy aprendiendo javascript. el código de muestra es de un tutorial de youtube que estoy viendo, la lección trata sobre la función incrustada dentro de una función, la primera función se llama "nombre", luego el parámetro de concat de la función incrustada también es "nombre", luego el valor de retorno es return concat (fullName );<--- esta parte realmente me confunde, porque usó "nombre" tres veces cuando dio un nombre para la primera función y la segunda como parámetro para la función concat y la tercera en la cadena concatenada, y dado que var fullName = "lawrence Turton" se define en el nombre de la variable fullName, y no puedo encontrar una conexión clara entre "lawrence Turton" (cadena) y "nombre" (parámetro) (variable),
mi pregunta aquí es por qué el parámetro en la función concat no puede ser (fullName) ya que "lawrence Turton" ya se ha definido en la variable FullName.
¿Por qué no escribirlo de esta manera?
function name(){ var fullName = "lawrence Turton"; function concat(fullName){ return "Hello Mr. " + fullName; }; return concat(fullName); }También probé esto y funcionó
¿Por qué no puedo escribirlo de esta manera?
Como probablemente ya hayas descubierto, puedes hacerlo. Pero se recomienda que lo evites.
¿Por qué? Tu puedes preguntar. Bueno, debe tener en cuenta que dentro de su función concat , el identificador " fullName " se refiere al argumento de la función y no a la variable fullName declarada en el ámbito externo, esto puede denominarse "variable shadowing" y no se considera una buena práctica. (por eso tratamos de evitarlo).
Si está dispuesto a aprender JS, seguramente se encontrará con un cierto tema de "Alcance", ya que es uno de los pilares del lenguaje. Puede leerlo brevemente en W3Schools: JavaScript Scope , pero le recomiendo que se sumerja profundamente mientras aún está comenzando a aprender JS.
Puede leerlo mucho, mucho más a fondo aquí (Todavía no conoce JS: Alcance y cierres, por Kyle Simpson) .
El ejemplo de código no es tan bueno porque la función no hace lo que dice que hace.
Se llama nombre, pero devuelve un saludo al nombre.
Además, puede recuperar .concat() para agregar más cosas al final del mensaje.
function name() { var fullName = "lawrence Turton"; function concat(name) { return "Hello Mr. " + name; } return concat(fullName); } console.log(name()); console.log(name().concat("more stuff at the end."));Tendría más sentido usar las funciones como métodos, para que puedan hacer más cosas.
En el siguiente ejemplo, podemos llamar a .greet() para recibir un saludo o cambiar el nombre de usuario con .setName() .
Si observa las funciones devueltas, usamos una función de flecha y una función anónima. Esto se debe a que en setName, queremos devolver this contexto, por lo que podemos encadenar los métodos. Esto nos permite hacer user.setName(name).greet() . Con una función de flecha, this funciona de manera diferente y no funcionaría igual.
Aquí hay un enlace a más detalles: Esta diferencia
const createUser = (username) => ({ greet: (greeting) => { if(greeting) return greeting + username; return `Hi, ${username}` }, setName: function(_username){ username = _username; return this; }, }) const user = createUser("John Smith"); console.log(user.greet()) user.setName("Fred") console.log(user.greet()) console.log(user.setName("Steve").greet())Esta funcionalidad es similar a una clase. Con una clase, se vería así:
class User { // the constructor is ran when you initialize the class. constructor(username){ this._username = username; } greet(greeting){ if(greeting) return greeting + this._username; return `Hi, ${this._username}`; } setName(name){ if(name) this._username = name; return this; } } // You have to have new to create a new instance of the class. const user = new User("John Snow"); console.log(user.greet()); user.setName("John Wick"); console.log(user.greet()) console.log(user.setName("John Smith").greet())Puedes usar la versión que prefieras.