Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   callee без arguments (https://javascript.ru/forum/dom-window/69267-callee-bez-arguments.html)

Malleys 09.06.2017 22:55

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();

nerv_ 11.06.2017 17:55

Что мешает сохранить ссылку на функцию и вызывать ее?)

Malleys 30.01.2020 00:43

Цитата:

Сообщение от Rise
(function localOnly() {
    localOnly();
})();

Да, это именно то, что было нужно!

Цитата:

Сообщение от Rise
а про засорение именем ты наверное пошутил, создав лишние функции в своей идее)

Это не моя идея, это называется Y-комбинатор, который действует в общем так же, как предложенный вами вариант!


Часовой пояс GMT +3, время: 16:46.