Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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();
Ответить с цитированием
  #2 (permalink)  
Старый 10.06.2017, 01:17
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

Сообщение от Malleys
В стрелочной функций конечно же не существует arguments (Uncaught ReferenceError: arguments is not defined), да и давать имя такой функций ради рекурсивного вызова как-то не практично (засорение глобального или локального контекста переменными).
По синтаксису у стрелочной функции не может быть имени, а про засорение именем ты наверное пошутил, создав лишние функции в своей идее)
Сообщение от Malleys
Так как же вызвать анонимную функцию рекурсивно в строгом режиме?
(function localOnly() {
	localOnly();
})();
Ответить с цитированием
  #3 (permalink)  
Старый 11.06.2017, 17:55
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

Что мешает сохранить ссылку на функцию и вызывать ее?)
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #4 (permalink)  
Старый 30.01.2020, 00:43
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Rise
(function localOnly() {
    localOnly();
})();
Да, это именно то, что было нужно!

Сообщение от Rise
а про засорение именем ты наверное пошутил, создав лишние функции в своей идее)
Это не моя идея, это называется Y-комбинатор, который действует в общем так же, как предложенный вами вариант!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск браузера (IE6 и выше) без "офорлмения" - без панелей, меню, строки состояния jett Events/DOM/Window 4 23.11.2011 15:58
$.ajax работает без success но при этом часть кода перезагружается!? saturn Элементы интерфейса 0 16.10.2011 10:09
Get запрос в Greasemonkey без обновления страницы 100matolog Общие вопросы Javascript 1 03.10.2011 04:37
Подскажите как в VLC плеере переключать канал без перезагрузки страницы? mff Events/DOM/Window 0 10.05.2010 17:28
Автообновление <div> без перезагрузки страницы Antihrist AJAX и COMET 14 28.07.2008 06:06