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?

1
carduh 10 dic. 2015 a las 03:19

4 respuestas

La mejor respuesta

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.

4
Bergi 10 dic. 2015 a las 00:32

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.

0
joseeight 10 dic. 2015 a las 00:36

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);
}
1
Amadan 10 dic. 2015 a las 00:41

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í.

1
zvone 10 dic. 2015 a las 00:44
34191573