javascript: как обратиться к анонимной функции внутри самой функции?

если arguments.callee не разрешен в "use strict", и мы не можем сделать

var f = function g() {
    //g
}

потому что в IE это не сработает (или сработает "странно") http://kangax.github.com/nfe/#jscript-bugs, то какие еще варианты у нас есть для ссылки на анонимную функцию внутри самой функции?


person Pacerier    schedule 22.04.2011    source источник
comment
Это не анонимная функция. анонимные функции не имеют дескриптора (например, f в вашем случае)   -  person neebz    schedule 22.04.2011
comment
@nEEbz: g делает его не анонимным. Функция в выражении `var f = function() {}`` является анонимной.   -  person Tim Down    schedule 22.04.2011


Ответы (3)


Именно для этого предназначен комбинатор Y.

Вот статья Джеймса Коглана о создании комбинатора Y в JavaScript.

person Jörg W Mittag    schedule 22.04.2011
comment
Комбинатор Y здесь кажется излишним. - person Matt Ball; 22.04.2011
comment
@Matt Ball: это универсальное решение этой проблемы, которое работает не только для JavaScript, но и для любого языка. Решение @jamietre, например, выглядит в основном как идиоматическая реализация JavaScript комбинатора Y с применением некоторого встраивания. Сомневаюсь, что вы сами сможете придумать такой трюк, если никогда не слышали о комбинаторе Y. - person Jörg W Mittag; 22.04.2011

Не используйте именованное функциональное выражение. Просто объявите и инициализируйте его обычным способом.

function f() {
    f();
}

Единственная жизнеспособная альтернатива со строгим ES5 - использовать код в вашем вопросе и иметь дело с дрянной реализацией NFE в IE. Но: вы действительно ожидаете, что браузер, который так ужасно ошибается с NFE (гм, IE), будет реализовывать "use strict" в ближайшее время?

person Matt Ball    schedule 22.04.2011
comment
@Matt Ball, возможно, я ошибся, но я помню, что читал, что объявления функций (обычным способом) не разрешены в строгом ES5, если только они не находятся в глобальной области видимости. - person Pacerier; 22.04.2011
comment
@Pacerier [citation needed] - person Matt Ball; 22.04.2011
comment
Бета-версия @MattBall iE10 имеет строгое использование. Это битый хром/сафари. - person Raynos; 22.04.2011
comment
@Pacerier: эта страница MDC заставляет меня думать, что вы неправильно помните. - person Matt Ball; 22.04.2011
comment
@Raynos исправил ли IE10 эту проблему? - person Pacerier; 22.04.2011
comment
@Pacerier Я не знаю. Я предполагаю, что именованные функциональные выражения работают в IE9, если это не так, я очень рассержусь. - person Raynos; 22.04.2011
comment
@Pacerier: объявления функций разрешены в глобальном или функциональном коде, но не внутри блоков. - person Tim Down; 22.04.2011
comment
@Tim, что имеет смысл в любом случае, поскольку JS имеет только глобальные и функциональные области, а не блочные области. - person Matt Ball; 22.04.2011

Вот довольно запутанный способ сделать это, но он работает:

http://jsfiddle.net/4KKFN/4/

var f = function() {
    function f() {
        if (confirm('Keep going?')) {
            this.apply(this);
        }
    }
    f.apply(f);
}

f();
person Jamie Treworgy    schedule 22.04.2011
comment
Не могу сказать, что я бы использовал что-то подобное в реальном коде, но похоже на законный обходной путь... - person Jamie Treworgy; 22.04.2011
comment
Теперь, только что прочитав о комбинаторе Y (впервые я о нем услышал), я понял, что на самом деле это одно и то же. - person Jamie Treworgy; 22.04.2011