Debido a que las devoluciones de llamada se comportan como si realmente estuvieran ubicadas dentro de una función, en la práctica son cierres: pueden acceder a las variables y parámetros de la función que los contiene, e incluso a las variables del ámbito global enlace. ¿Derecha? Pero si lo hago:
function fullName(firstName, lastName, callback){
var f_scope = "X";
console.log("My name is " + firstName + " " + lastName);
callback(lastName);
}
var greeting = function(ln){
console.log('Welcome Mr. ' + ln);
console.log(f_scope);//<<---error
};
fullName("Jackie", "Chan", greeting);
Por otro lado, si greeting
estaba dentro de fullName
, el error no ocurrirá. Entonces, ¿las devoluciones de llamada no son 100% similares si se colocan dentro de una función? ¿Derecho?
4 respuestas
pueden acceder a las variables y parámetros de la función que los contiene
Léxico que contiene. Pueden acceder a las variables desde el ámbito en el que se define la función, no desde el ámbito donde se llama. Las funciones en JS hacen cierres léxicos, hay no alcance dinámico .
Esa variable f_scope
no es una variable global ni se declara en una función que contiene greeting
.
FullName está en el contexto raíz, por lo que puede verse a sí mismo y "saludo".
FullName luego crea "f_scope" que solo es visible dentro de fullName.
El contexto raíz llama a fullName con firstName, lastName, callback. FirstName y lastName solo están disponibles dentro del contexto fullName, ya que los parámetros son variables locales / privadas de la función.
FullName luego llama a la devolución de llamada, que acepta un parámetro, ln, que resulta ser el último parámetro / variable en fullName, pero esto se pasa como un parámetro, no se accede directamente.
F_scope es privado para fullName, por lo tanto, no puede llamarlo dentro del saludo, puede pasarlo al saludo si lo convierte en un parámetro de la función.
Porque las devoluciones de llamada se comportan como si realmente estuvieran ubicadas dentro de una función
Las devoluciones de llamada definidas dentro de una función se comportan como si estuvieran definidas dentro de una función. Las devoluciones de llamada definidas fuera de una función se comportan como si estuvieran definidas fuera de una función.
Ellas estan en practica cierres
Son son cierres, en teoría y en la práctica. Lo que difiere es lo que cierran.
var x = 1;
function externalCallback() {
// closes over x, someFunction, externalCallback
}
function someFunction() {
var y = 2;
var internalCallback = function() {
// closes over x, someFunction, externalCallback, internalCallback, y
}
setTimeout(externalCallback, 0);
setTimeout(internalCallback, 0);
}
Echale un vistazo a éste ejemplo:
function callback_caller(callback) {
var x = 7;
callback();
}
function func1() {
var y = 9;
function inner_func() {
// console.log('x', x); // <-- this would not work
console.log('y', y); // <-- this is ok
}
return inner_func;
}
var callback = func1();
callback_caller(callback); // prints: y 9
En el momento en que se llama a inner_func
, func1
, que contiene la variable y
, ya no existe, pero aún inner_func
puede acceder a él. Eso es porque y
está en el cierre.
Por otro lado, x
no tiene nada que ver con inner_func
y nunca está disponible allí.
Preguntas relacionadas
Preguntas vinculadas
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.