Задать вопрос
scottishFold
@scottishFold

Почему рекурсивную функцию нужно присваивать переменной при работе с декоратором?

Есть рекурсивная функция
function fac(num) {
	if (num == 1) {
		return num
	} else {
		return num * fac(num - 1)
	}
}


И есть декоратор которая выводит результат в консоль
function logResultDecorator(func) {
	return function() {
		let result = func.apply(this, arguments)
		console.log('Результат функции: ', result)
	}
}


Почему когда я передаю декоратору обычную функцию (Function Declaration), в результате получаю 1 и несколько раз NaN
function fac(num) {
	if (num == 1) {
		return num
	} else {
		return num * fac(num - 1)
	}
}

function logResultDecorator(func) {
	return function() {
		let result = func.apply(this, arguments)
		console.log('Результат функции: ', result)
	}
}

fac = logResultDecorator(fac)

fac(5)
/* Результат функции:  1
Результат функции:  NaN
Результат функции:  NaN
Результат функции:  NaN
Результат функции:  NaN */


Но когда передаю декоратору Function Expression, все работает корректно
let fuc = function fac(num) {
	if (num == 1) {
		return num
	} else {
		return num * fac(num - 1)
	}
}

function logResultDecorator(func) {
	return function() {
		let result = func.apply(this, arguments)
		console.log('Результат функции: ', result)
	}
}

fuc = logResultDecorator(fuc)

fuc(5)
// Результат функции:  120


Почему функцию нужно присваивать переменной? Я не понимаю
  • Вопрос задан
  • 121 просмотр
Подписаться 1 Средний Комментировать
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас декоратор не возвращает значение декорируемой функции.
В первом случае это приводит к тому, что при рекурсивном вызове fac() в строке return num * fac(num - 1) выполняется умножение на undefined.
Во втором случае вы рекурсивно вызываете незадекорированную функцию fac(), поскольку декорируете fuc().
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы