Ответ 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 устарел)
И больше по строгим