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


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

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

Войти через центр авторизации
Похожие вопросы