Poznakomlus, пишут ведь, что «чтобы не зависеть от имени функции». Ещё ваш вариант предполагает засорение глобального объекта, а также его изменение! Также у вас не соблюдена
чистота функции. Также вы не показали, как получить функцию внутри функции не используя callee!
drwhite, в JavaScript как раз для этого и есть
arguments.callee, который указывает на функцию.
Однако стоит учитывать, что по имени функции не всегда возможно обратиться к самой функции, поэтому лучше говорить о ссылке на функцию.
function factorial(n) {
if(n % 1 !== 0 || n < 0) throw Error("n ∈ Z ⋀ n ≥ 0");
if(n === 0) return 1;
return n * arguments.callee(n - 1);
}
alert(factorial(5)); // 5! = 120
Однако, если вы вдруг решили, что вам по каким-то причинам
arguments.callee не подходит (по каким?), то вы можете использовать Y-комбинатор!
var Y =
f => (
g => x => f(g(g))(x)
)(
g => x => f(g(g))(x)
);
var factorial = Y(fn => n => {
if(n % 1 !== 0 || n < 0) throw Error("n ∈ Z ⋀ n ≥ 0");
if(n === 0) return 1;
return n * fn(n - 1);
});
alert(factorial(5)); // 5! = 120
Обращение функции к самой себе вообще не предполагает наличие глобальной ссылки. Т. е. поскольку она не называет себя по имени, она не связана тесно с самой собой.