Существует использование arguments.callee без хорошей альтернативы?
Существует много ошибок в аргументе arguments.callee, и я пытаюсь понять, существуют ли случаи использования, когда его действительно нельзя заменить жизнеспособной альтернативой строгого режима ES5.
В документации MDN arguments.callee они указывают на использование arguments.callee без хорошей альтернативы со следующим примером кода ниже:
function createPerson (sIdentity) {
var oPerson = new Function("alert(arguments.callee.identity);");
oPerson.identity = sIdentity;
return oPerson;
}
var john = createPerson("John Smith");
john();
Они включили в себя ошибку, показывающую, что в некоторых случаях аргумент. Не может быть заменен кодом в соответствии со строгим режимом ES5.
Но, понимая, код, который они использовали в качестве примера, можно заменить следующей альтернативой строгого режима:
"use strict";
function createPerson(sIdentity) {
var oPerson = function () {
alert(oPerson.identity);
};
oPerson.identity = sIdentity;
return oPerson;
}
var john = createPerson("John Smith");
john();
С учетом этого действительно существуют некоторые алгоритмы, где arguments.callee не может быть заменен?
BOUNTY
Чтобы выиграть награду, я хочу, чтобы ответ содержал использование arguments.callee
где будет гораздо более непонятным или невозможным использовать другое решение.
В примере с MDN версия, которую я написал в качестве альтернативы, не меняет использование этого фрагмента кода.
3 ответа
Вот пример использования: сохраняйте переменную для встроенного обработчика событий (который может быть получен из сгенерированного / шаблонного кода), не загрязняя глобальное пространство имен или DOM и не рискуя другими конфликтами имен:
<button onclick="var f=arguments.callee;alert(f.i=(f.i||0)+1)">CLICK</button>
Теперь, скажем, это не законное использование. Конечно, нет ничего действительно законного или arguments.callee
не был бы уволен.
Боюсь, вы неправильно поняли пример. Это означает использование конструктора Function, а альтернативы аргументу нет. Так сказать, код ниже
function createPerson (sIdentity) {
var oPerson = new Function("alert(oPerson.identity);");
oPerson.identity = sIdentity;
return oPerson;
}
var john = createPerson("John Smith");
john();
неправильно
Когда вы создаете функцию динамически (из строки), она не может "захватить" какие-либо внешние переменные, как это делает обычное замыкание.
Итак, пример MDN имитирует замыкание, делая значение доступным через arguments.callee
, На самом деле нет другого пути без изменения сигнатуры функции.