Nie znalazłem żadnej kompletnej Doktora Przeglądarki do przeglądarki tej zmiennej.

Do czego jest arguments.callee? jak to działa?

Jakie argumenty mają?

26
Jordi P.S. 21 sierpień 2012, 11:32

5 odpowiedzi

Najlepsza odpowiedź

arguments.callee jest odniesieniem do aktualnie nazywanej funkcją. Najpierw pierwsze rzeczy: nie używaj go: jeśli jesteś w ścisłym kontekście, po prostu wysuwa błędy.

Jednak osobiście-i Nie jestem sam w tym - przegapię tę nieruchomość. Zanim wyjaśnię, dlaczego dam ci pseudo-przykład, gdy możesz użyć tego:

var looper = (function(someClosureVar)
{
    setTimeout((function(resetTimeout)
    {
        return function()
        {
            //do stuff, stop OR:
            resetTimeout();
        };
    }(arguments.callee)),1000);
}(document.getElementById('foobar')));

Mam nadzieję, że lubisz zamknięcia, ponieważ robię - i tam jest arguments.callee. Nadal-to ostatnia linia polega na tym, gdzie są pieniądze:

(arguments.callee)

Jest odniesieniem do funkcji anonimowej, która ustawia początkowe limit czasu, w zakresie zamknięcia (w tym przypadku dostęp do elementu 1 DOM). Anonimowe funkcje są GC'ed po powrocie, ale w tym przypadku dodałem go do zakresu czasu zwrotu pieniędzy (przekazał go jako argument do innej anonimowej funkcji, która zwraca rzeczywiste wywołanie zwrotne), więc wciąż się znajduje.
Teraz, jeśli jesteś w surowym, musisz się martwić, ponieważ jest to, jak wyglądałby kod w ścisłym trybie:

var looper = (function tempName(someClosureVar)
{
    setTimeout((function(resetTimeout)
    {
        return function()
        {
            //do stuff, stop OR:
            resetTimeout();
        };
    }(tempName)),1000);
}(document.getElementById('foobar')));

Nazwij funkcję i to jest. Dlaczego tego nie lubię? arguments.callee Podnosi flagi, podobnie jak anonimowe funkcje, na których dzieje się oszukanie zamknięcia. Myślę, że to tylko zwyczaj, ale to, że czuję, pomaga mi łatwiej strukturować i debugować mój kod.
Para, która z patologiczną nienawiścią dla IE, która przychodzi naturalnie dla każdego, kto robi skryptowanie po stronie klienta. Tj. Wersje, które nie obsługują trybu ścisłego, mają tendencję do wyciek Nazwa funkcji do globalnej przestrzeni nazw, nigdy nie pozwalając na pamięć związaną z funkcją (a zamknięciem, które stworzyliśmy), aby być GC ' ed. Co może prowadzić do odwołań okólników, a gorzej nadal, okrągłe odniesienia DOM, które mogą prowadzić do wycieków pamięci.

Właściwie: Oto inny, prawdziwy przykład gdzie arguments.callee jest używany: Delegacja zdarzeń i odłączanie zdarzenia słuchacze
Oto Więcej informacji w trybie ścisłym js i rekurencji przy użyciu arguments.callee.

Ostatnie pytanie, IMO najbardziej wyraźny wycięty przykład tego, jak arguments.callee jest przydatny: Rekuerive Wymiana funkcji:

function someF(foo)
{
    //'use strict'; <-- would throw errors here
    foo = foo.replace(/(a|b)+/gi, function (p1,p2)
    {
        if (p1.match(/(a|b){2,}/i))
        {
            return p1.replace(/(a|b)/gi,arguments.callee);//recursive
        }
        return (p2.match(/a/i) ? 'X':'Y');
    });
}

Zgodnie z żądaniem arguments.callee na MDN, ostrzega Do użytku w trybie ścisłym (ECMA 5, który wyjaśnia, dlaczego DC mówi argumenty Functions_and_function_scope / strict_mode? RedirectloCale = en-us & amp; redirectslug = javascript% 2fStric_mode "rel =" NefErr "> Więcej na temat ścisłego

31
Community 23 maj 2017, 10:30

Calee jest częścią standardu ECMAScript 3, więc powinno być bezpieczne dla wykorzystania przeglądarki. Callee posiada aktualnie wykonując funkcję, która jest aktualnie wywoływana, wywoła bieżącej funkcji. Dlatego Callee zajmuje dokładnie te same argumenty, co funkcja załączania (lub raczej IT jest bieżąca funkcja). Niektóre więcej informacji są dostępne tutaj: https: // deweloper. mozilla.org/en-us/docs/javascript/reference/functions_and_function_scope/arguments/callee.

Jest uważany za zły styl do używania Callee. Zamiast tego zapewniam nazwę i użyj tej nazwy ...

4
Mathias Schwarz 21 sierpień 2012, 07:38

Określa aktualnie wykonując funkcję, więc arguments.callee jest bieżącą funkcją. Może być pomocny, jeśli trzeba pojechać rekurencyjne w anonious funkcji. Tutaj przykład z Mozilli:

function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);
   };
}

var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)
4
Danil Speransky 21 sierpień 2012, 07:41

Argumenty . . . .

 function factorial(a){
    if(a>0)
      return a*arguments.callee(a-1);
 }

Tutaj, jeśli dzwonisz do Factware (5), sprawdzi, że stan większy niż 0, a jeśli jest to prawdą, wykonuje tę samą logikę dla następnego mniejszego numeru. . . W niektórych przypadkach nie znasz nazwy funkcji do wywołania. . . . możesz użyć tej nieruchomości

Oto dobra odniesienie

argumenty.Callee z MDN.

Aktualizacja : arguments.callee() jest przestarzałe w ES5

3
palerdot 28 kwiecień 2015, 16:57

Callee jest właściwością obiektu argumentów. Może być używany do odnoszenia się do aktualnie wykonywalnego funkcji wewnątrz korpusu funkcji tej funkcji.

MDN Docs tutaj

2
benqus 21 sierpień 2012, 07:38