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

callee без arguments
Всем привет!

Как известно, 5-ая редакция спецификаций ECMAScript запрещает использовать arguments.callee(); в строгом режиме. Стоит избегать использования arguments.callee(); давая функций имя либо использовать определение функций, в котором функция вызывает сама себя.

В стрелочной функций конечно же не существует arguments (Uncaught ReferenceError: arguments is not defined), да и давать имя такой функций ради рекурсивного вызова как-то не практично (засорение глобального или локального контекста переменными).

Так как же вызвать анонимную функцию рекурсивно в строгом режиме?

//В ES3 это было бы так
(function() {
	arguments.callee();
})();


Я тут попытался повторить тоже самое, но без использования arguments.callee();
// Идея заключается в том, чтобы вызвать функцию,
//которая в качестве аргумента принимает такую функцию А,
//которую если вызвать, то она вызовет функцию Б,
//вызывающей функцию В с аргументом В, где В является
//аргументом той функций, которую вызывает А.

"use strict";
(
	f => (
		g => f(() => g(g))
	)(
		g => f(() => g(g))
	)
)(a => a());


Или более приземлённый пример, который даже можно запустить...
"use strict";
(
	f => (
		g => f(() => g(g))
	)(
		g => f(() => g(g))
	)
)(a => {
	console.log("Hello!");

	setTimeout(a, 1000);
});


А ты как вызываешь анонимную функцию рекурсивно в строгом режиме или что тут можно улучшить?

P. S. В не стогом режиме Вы по прежнему можете использовать arguments.callee();
Ответить с цитированием