risposta minitech è abbastanza buona, ma manca uno scenario in più. La tua funzione di dichiarazione chiamata callback, che significa due cose, prima la funzione è l'oggetto in memoria, e il secondo, il nome della funzione è solo per fare riferimento all'oggetto. Se tu, per qualsiasi ragione, rompi il riferimento tra questi due, il codice proposto non funzionerà.
Dimostrazione:
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.
Da developer Mozilla page nella descrizione è:
Attenzione: La 5 ° edizione di ECMAScript (ES5) vieta l'uso di arguments.callee() in modalità rigorosa. Evitare di usare arguments.callee() per dando un nome alle espressioni di funzione o utilizzare una dichiarazione di funzione in cui una funzione deve chiamarsi.
ovviamente questo è il primo esempio di soluzione "da entrambe dando funzione di espressioni un nome", ma permette di vedere come possiamo affrontare "o utilizzare una dichiarazione di funzione in cui una funzione deve chiamarsi" e ciò sarà che portano:
function callback(){
//...
setTimeout(innercall(), 100);
function innercall(){
//innercall is safe to use in callback context
innercall.caller(); //this will call callback();
}
}
allora siamo sicuri di fare tutto ciò che vogliamo con il riferimento di richiamata:
var callback2 = callback;
callback = null;
callback2(); //will work perfectly.
per wh vale: [espressioni di funzioni denominate demistificate] (http://kangax.github.com/nfe/). – sdleihssirhc
Sì, dovresti nominare la tua funzione e usare il suo nome in setTimeout. – kubetz
possibile duplicato di [Perché la proprietà arguments.callee.caller è stata deprecata in JavaScript?] (Http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in- javascript) – cHao