Odpowiedź minitech jest całkiem dobra, ale brakuje jeszcze jednego scenariusza. Twoja funkcja deklaracji nazywa się callback, co oznacza dwie rzeczy, najpierw funkcja jest obiektem w pamięci, a druga nazwa funkcji służy tylko do odniesienia do obiektu. Jeśli z jakiegokolwiek powodu zerwiesz odniesienie między tymi dwoma, proponowany kod również nie zadziała.
Dowód:
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.
Od developer Mozilla page w opisie jest:
Ostrzeżenie: 5. edycja ECMAScript (ES5) zabrania używania arguments.callee() w trybie ścisłym. Unikaj używania arguments.callee() przez , podając nazwy funkcji lub używając deklaracji funkcji, w której funkcja musi się sama wywoływać.
oczywiście jest to pierwszy przykład obejścia „przez każdą funkcję dając wyrażenia nazwę”, ale pozwala zobaczyć, w jaki sposób mamy do czynienia z „lub użyć deklarację funkcji, gdzie funkcja musi nazywać się” i Co będzie, że przyniesie:
function callback(){
//...
setTimeout(innercall(), 100);
function innercall(){
//innercall is safe to use in callback context
innercall.caller(); //this will call callback();
}
}
Wtedy jesteśmy bezpieczni robić co chcemy z odniesieniem callback:
var callback2 = callback;
callback = null;
callback2(); //will work perfectly.
dla wh na ile warto: [Wywoływane nazwane wyrażenia funkcji] (http://kangax.github.com/nfe/). – sdleihssirhc
Tak, powinieneś nazwać swoją funkcję i użyć jej nazwy w setTimeout. – kubetz
możliwy duplikat [Dlaczego właściwość arguments.callee.caller przestała być używana w JavaScript?] (Http://stackoverflow.com/questions/103598/why-was-targuments-callee-caller-property-deprecated-in- javascript) – cHao