Существует использование 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, На самом деле нет другого пути без изменения сигнатуры функции.

Другие вопросы по тегам