Я не нашел полного кросс-браузерного документа этой переменной.
Что такое arguments.callee
для? как это работает?
Какие аргументы он имеет?
Я не нашел полного кросс-браузерного документа этой переменной.
Что такое arguments.callee
для? как это работает?
Какие аргументы он имеет?
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 устарел)
И больше по строгим
Calee является частью стандарта ECMAScript 3, поэтому он должен быть безопасным для использования в разных браузерах. Callee выполняет функцию, которая в настоящее время выполняется и вызывает ее, будет вызывать текущую функцию. Поэтому вызываемый принимает те же аргументы, что и закрывающая функция (точнее, это текущая функция). Дополнительная информация доступна здесь: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Functions_and_function_scope/arguments/callee
Считается, что плохой стиль использовать вызываемый. Дайте вам имя функции и используйте это имя...
callee является свойством объекта arguments. Его можно использовать для ссылки на исполняемую в данный момент функцию внутри тела функции этой функции.
Указывает текущую исполняемую функцию, поэтому 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)
arguments.callee - это круг вокруг способа узнать текущую исполняемую функцию, спросив: "Кто вызывает этот конкретный аргумент?",,.
function factorial(a){
if(a>0)
return a*arguments.callee(a-1);
}
Здесь, если вы вызываете factorial (5), он будет проверять условие больше 0, и если оно истинно, будет выполнять ту же логику для следующего меньшего числа., В некоторых случаях вы не знаете имя вызываемой функции.,.so вы можете использовать это свойство
вот хорошая ссылка
UPDATE: arguments.callee()
устарел в ES5