2011-12-02 13 views
33

Do robienia rzeczy jakArguments.callee jest przestarzałe - co należy zamiast tego użyć?

setTimeout(function() { 
    ... 
    setTimeout(arguments.callee, 100); 
}, 100); 

muszę coś podobnego arguments.callee. Znalazłem information at javascript.info że arguments.callee jest przestarzała:

Ta właściwość jest nieaktualna przez ECMA-262 na rzecz wymienionych funkcji wyrażeń i dla lepszej wydajności.

Ale co należy wtedy użyć? Coś takiego?

setTimeout(function myhandler() { 
    ... 
    setTimeout(myhandler, 100); 
}, 100); 
// has a big advantage that myhandler cannot be seen here!!! 
// so it doesn't spoil namespace 

BTW, czy arguments.callee jest kompatybilny z różnymi przeglądarkami?

+2

dla wh na ile warto: [Wywoływane nazwane wyrażenia funkcji] (http://kangax.github.com/nfe/). – sdleihssirhc

+0

Tak, powinieneś nazwać swoją funkcję i użyć jej nazwy w setTimeout. – kubetz

+1

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

Odpowiedz

10

Tak, to teoretycznie powinno być powinno być. Masz rację. Jednak jak zwykle nie działa w niektórych wersjach Internet Explorera. Więc uważaj. Być może trzeba by się znowu na arguments.callee, lub raczej, jak prosta:

function callback() { 
    // ... 
    setTimeout(callback, 100); 
} 

setTimeout(callback, 100); 

Który działa na IE.

+1

Czekaj - chcesz powiedzieć, że 'setTimeout (funkcja myhandler() {setTimeout (myhandler ...' nie działa w niektórych wersjach IE?) Czy jest to coś niestandardowego? Myślałem, że jest to dość standardowa rzecz do zrobienia – TMS

+3

@ TomasT .: It * jest * standardem - ale od kiedy to IE kiedykolwiek było kompletnie standardowe? :) (No, może IE10.) Pamiętam, że przez jakiś czas się o to potknąłem. Szybki test pokazuje, że to nie problem przynajmniej w IE7. Prawdopodobnie IE6 Nie mam go ze sobą do testowania – Ryan

+0

Według Microsoftu działa on w IE6: https://docs.microsoft.com/en-us/scripting/javascript/reference/callee -property-arguments-javascript –

0

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. 
+0

'caller' nie jest dobrą praktyką , a przykładowy kod tutaj nie wydaje się ustawiać timeout. Po prostu nie zastępuj deklarowanej funkcji. – Ryan

Powiązane problemy