La respuesta de minitech es bastante buena, pero falta un escenario más. Su función de declaración llamada devolución de llamada, que significa dos cosas, primero la función es objeto en la memoria, y el segundo, el nombre de la función es solo para hacer referencia al objeto. Si usted, por alguna razón, rompe la referencia entre estos dos, el código propuesto tampoco funcionará.
Prueba:
function callback() {
// ...
setTimeout(callback, 100);
}
setTimeout(callback, 100);
var callback2 = callback; //another reference to the same object
callback = null; //break the first reference
callback2(); //callback in setTimeout now is null.
De developer Mozilla page en la descripción es:
Advertencia: La quinta edición de ECMAScript (ES5) prohíbe el uso de arguments.callee() en modo estricto. Evite el uso de arguments.callee() por dando un nombre a las expresiones de función o use una declaración de función donde una función debe llamarse a sí misma.
, obviamente, este es el primer ejemplo de la solución provisional "ya sea por función dar expresiones un nombre", pero vamos a ver cómo podemos hacer frente a "o utilizar una declaración de función en una función debe llamarse" y lo que habrá que llevar:
function callback(){
//...
setTimeout(innercall(), 100);
function innercall(){
//innercall is safe to use in callback context
innercall.caller(); //this will call callback();
}
}
entonces estamos seguros de hacer lo que queramos con la referencia de devolución de llamada:
var callback2 = callback;
callback = null;
callback2(); //will work perfectly.
para WH vale la pena: [expresiones de funciones nombradas desmitificadas] (http://kangax.github.com/nfe/). – sdleihssirhc
Sí, debe nombrar su función y usar su nombre en setTimeout. – kubetz
posible duplicado de [¿Por qué la propiedad arguments.callee.caller está en desuso en JavaScript?] (Http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- javascript) – cHao