Home > Веб-разработка > Как вызвать анонимную функцию JS рекурсивно

Как вызвать анонимную функцию JS рекурсивно

В JavaScript есть возможность объявлять функции без имени, такие функции называют анонимными, их можно присвоить переменной или немедленно вызвать. Но что если ей надо вызвать саму себя, как без имени можно сделать рекурсию?
Например вы хотите посчитать факториал, это можно сделать при помощи рекурсии. Буду так же рад услышать в комментариях примеры где может понадобится использование рекурсии анонимной функции.

Вот пример JavaScript функции с рекурсивным вызовом анонимной функции, который вычисляет факториал числа.

var f = function(N){
  if (N<0) return "Ошибка во входящих данных.";
  if (N==0 || N==1) { return 1; }
  return N * arguments.callee(N-1);
};
// 5!
f(5); // 120

Кстати, в моем браузере максимальное число N для которого факториал считается это 170, для чисел больше выдается "Infinity".

В начале выполнения в каждой функции создается внутри переменная arguments и в arguments.callee записывается ссылка на себя. Таким образом вызывов arguments.callee(N-1) вызовет нашу функцию с новым значением, что нам и требовалось. Есть еще одно полезное свойство arguments.callee.caller, которое содержит ссылку на функцию которая вызвала данную.

Однако, не стоит использовать эти свойства в новом коде, так как они признаны устаревшими(deprecated). Так что в пятой редакции ECMAScript в строгом режиме(Strict Mode), который можно включить строкой "use strict", этот пример выдаст ошибку:

TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*

?

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackbacks:0

Listed below are links to weblogs that reference
Как вызвать анонимную функцию JS рекурсивно from EchoBlog::howToCode
TOP