Показать сообщение отдельно
  #3 (permalink)  
Старый 06.02.2020, 03:40
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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

Последний раз редактировалось Malleys, 06.02.2020 в 03:46.
Ответить с цитированием