Подтвердить что ты не робот

Javascript arguments.callee, что это за

Я не нашел полного кросс-браузерного документа этой переменной.

Что такое arguments.callee для? как это работает?

Какие аргументы он имеет?

4b9b3361

Ответ 1

arguments.callee является ссылкой на функцию, которая в настоящее время вызывается. Прежде всего: не используйте его: если вы находитесь в строгом контексте, это просто вызовет ошибки.

Однако, лично - и Я не одинок в этом - я пропущу это свойство. Прежде чем я объясню, почему, я дам вам псевдо-пример, когда вы можете использовать это:

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

Надеюсь, вам понравятся закрытия, потому что я это делаю - и что там, где arguments.callee, скорее всего, произойдет. Следующая строка - это деньги:

(arguments.callee)

Является ссылкой на анонимную функцию, которая устанавливает начальный тайм-аут, в пределах закрывающей области (в этом случае доступ к 1 элементу DOM). Анонимные функции GC'ed после их возврата, но в этом случае я добавил его в область обратного вызова тайм-аута (передал его как аргумент другой анонимной функции, которая возвращает фактический обратный вызов), поэтому он все еще упоминается где-то.
Теперь, если вы строгие, вам не нужно беспокоиться, потому что это то, что код будет выглядеть в строгом режиме:

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

Назовите функцию и ее. Почему мне это не нравится? arguments.callee поднимает флаги, подобно анонимным функциям, что происходит некоторая уловка закрытия. Я предполагаю, что это просто привычка, но ее, я считаю, помогает мне легче структурировать и отлаживать мой код.
Пара, которая с патологической ненавистью к IE, которая естественна для любого, кто делает некоторые клиентские скрипты. IE версии, которые не поддерживают строгий режим, имеют тенденцию просачивать имя функции в глобальное пространство имен, тем самым не позволяя памяти, связанной с этой функцией (и созданной нами закрытием), быть GC'ed. Что может привести к циркулярным ссылкам и, что еще хуже, круговым DOM-ссылкам, которые могут привести к утечкам памяти.

На самом деле: здесь используется другой реальный пример, где arguments.callee используется: делегирование событий и отключение прослушивателей событий
здесь еще немного информации о строгом режиме и рекурсии JS с помощью arguments.callee.

Последний вопрос: IMO - самый четкий пример того, как arguments.callee удобен: рекурсивные функции замены:

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');
    });
}

Как запрошено arguments.callee на MDN, предупреждает об использовании в строгом режиме (ECMA 5, это объясняет, почему DC говорит, что аргументы .callee is устарел)
И больше по строгим

Ответ 2

Calee является частью стандарта ECMAScript 3, поэтому он должен быть безопасным для использования в разных браузерах. Callee выполняет функцию, которая в настоящее время выполняется и вызывает ее, будет вызывать текущую функцию. Поэтому вызываемый принимает те же аргументы, что и закрывающая функция (точнее, это текущая функция). Дополнительная информация доступна здесь: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee

Считается, что плохой стиль использовать вызываемый. Дайте вам имя функции и используйте это имя...

Ответ 3

callee является свойством объекта arguments. Его можно использовать для ссылки на исполняемую в данный момент функцию внутри тела функции этой функции.

MDN docs here

Ответ 4

Указывает текущую исполняемую функцию, поэтому arguments.callee - текущая функция. Может быть полезно, если вам нужно пойти рекурсивно в анонимную функцию. Вот пример из mozilla:

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)

Ответ 5

arguments.callee - это круг вокруг способа узнать текущую исполняемую функцию, спросив: "Кто вызывает этот конкретный аргумент?",,.

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

Здесь, если вы вызываете factorial (5), он будет проверять условие больше 0, и если оно истинно, будет выполнять ту же логику для следующего меньшего числа., В некоторых случаях вы не знаете имя вызываемой функции.,.so вы можете использовать это свойство

вот хорошая ссылка

arguments.callee из MDN

UPDATE: arguments.callee() устарел в ES5