Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.04.2019, 18:36
Аспирант
Отправить личное сообщение для Иса Мирзоев Посмотреть профиль Найти все сообщения от Иса Мирзоев
 
Регистрация: 15.04.2019
Сообщений: 72

Вопрос по замыканию
Приветствую. Извиняюсь, если тема уже была (что наверняка, только я найти/понять не смог). Гугл мне тоже бегло не помог, обычно я всегда все находил сам. Пишу впервые, так как сам понимаю занятость людей. Вопрос такой: как засунуть в глобальную переменную локальную функцию, если в родительской функции есть НЕСКОЛЬКО дочерних равноправных функций?
Простой пример (сорян, вашим автокодом так и не воткнул, как пользоваться).

Вот пример.

function counter(){
            a = 5;
            function x(){
                a++; 
                console.log(a);
            }
             function y(){
                a --; 
                console.log(a); 
            }
        }
        counter()




Мне нужно трижды запустить функцию y(). Я знаю, как это сделать локально (вот так).

function counter(){
            a = 5;
            function x(){
                a++; 
                console.log(a);
            }
             function y(){
                a--;  
                console.log(a); 
            }
           y();
           y();
           y();
        }
counter()



Знаю, как вставить в переменную ЕДИНСТВЕННУЮ функцию из родительской функции. Вот так:

function counter(){
            a = 5;
           return function y(){
                a--; 
                console.log(a);
            }
        }
        
var value = counter();
value();
value();
value();



Но этот трюк работает лишь, если функция одна единственная в родительской функции. А у меня в верхнем самом примере две функции (х и у) в родительской. Собственно, вопрос озвучил - нужна глобальная переменная, содержащая функцию y(). Подскажите, пожалуйста. Баньте меня, если я совсем налажал. Полтора месяца изучаю программирование самостоятельно. Простые вопросы быстро гуглятся, а вот более специфические - нет. Спасибо всем откликнувшимся. Сорян за длиннопост. Надеюсь, показал, что сам частично смог разобраться.

Последний раз редактировалось Иса Мирзоев, 15.04.2019 в 23:12.
Ответить с цитированием
  #2 (permalink)  
Старый 15.04.2019, 19:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Иса Мирзоев,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[html run]
... минимальный код страницы с вашей проблемой
[/html]

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #3 (permalink)  
Старый 15.04.2019, 19:16
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Иса Мирзоев,
ничего не понял, подожду специалистов.
Ответить с цитированием
  #4 (permalink)  
Старый 15.04.2019, 21:17
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

function counter(){
  var a = 5;
  function x(){
    a++; 
    console.log(a);
  }
  function y(){
    a --; 
    console.log(a); 
  }
  return {x:x, y:y};
}

var value = counter();

value.y();
value.y();
value.y();


P.S.: а почему перестал работать запуск кода на сайте? Или это только у меня?
Ответить с цитированием
  #5 (permalink)  
Старый 15.04.2019, 21:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Белый шум,
как временый выход добавить теги script и обернуть в <> , видимо с тегом
[js run]
проблема, используйте
[html run]<script>...
Ответить с цитированием
  #6 (permalink)  
Старый 15.04.2019, 21:48
Аспирант
Отправить личное сообщение для Иса Мирзоев Посмотреть профиль Найти все сообщения от Иса Мирзоев
 
Регистрация: 15.04.2019
Сообщений: 72

Все отлично))
Сообщение от Белый шум Посмотреть сообщение
function counter(){
  var a = 5;
  function x(){
    a++; 
    console.log(a);
  }
  function y(){
    a --; 
    console.log(a); 
  }
  return {x:x, y:y};
}

var value = counter();

value.y();
value.y();
value.y();


P.S.: а почему перестал работать запуск кода на сайте? Или это только у меня?
Спасибо. Все работает. Но если не нужен return, а код должен повторяться без возврата, как поступить (то есть чтобы консоль постоянно выводила "4", "4", "4")? Или здесь это невозможно?

Последний раз редактировалось Иса Мирзоев, 15.04.2019 в 22:07.
Ответить с цитированием
  #7 (permalink)  
Старый 15.04.2019, 23:02
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Белый шум,
отпишись, работает ли в песочнице скрипт сейчас?
Ответить с цитированием
  #8 (permalink)  
Старый 15.04.2019, 23:38
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

Сделать то это можно так:
function counter(){
  var a = 5;
  x = function(){
    a++; 
    console.log(a);
  }
  y = function(){
    a--; 
    console.log(a); 
  }
}

counter();

y();
y();
x();

Но на самом деле так делать не надо.)
Если вам нужны глобальные переменные - значит вы с гарантией делаете что-то не так.
__________________
29375, 35
Ответить с цитированием
  #9 (permalink)  
Старый 16.04.2019, 00:04
Аспирант
Отправить личное сообщение для Иса Мирзоев Посмотреть профиль Найти все сообщения от Иса Мирзоев
 
Регистрация: 15.04.2019
Сообщений: 72

Сообщение от Aetae Посмотреть сообщение
Сделать то это можно так:
function counter(){
  var a = 5;
  x = function(){
    a++; 
    console.log(a);
  }
  y = function(){
    a--; 
    console.log(a); 
  }
}

counter();

y();
y();
x();

Но на самом деле так делать не надо.)
Если вам нужны глобальные переменные - значит вы с гарантией делаете что-то не так.
Про глобальность я это для себя спросил. Мне так проще понимать суть. Это не решение конкретной задачи, а для меня понимание того, что я в книгах и из видео-уроков не усвоил.
Благодарю Вас. Я как чувствовал, что есть более простое решение, чем элегантный код, предложенный форумчанином выше (больше спасибо Вам, Белый шум, понял с какими темами мне стоит еще поработать). В лс еще Вам напишу кое-что. Спасибо, закрываем тему.
Ответить с цитированием
  #10 (permalink)  
Старый 16.04.2019, 02:27
Аватар для Белый шум
Профессор
Отправить личное сообщение для Белый шум Посмотреть профиль Найти все сообщения от Белый шум
 
Регистрация: 19.01.2012
Сообщений: 498

Сообщение от рони Посмотреть сообщение
Белый шум,
отпишись, работает ли в песочнице скрипт сейчас?
Да, сейчас сработало.
Ответить с цитированием
Ответ


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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вопрос про возможности JS для рисования и анимации macdack Библиотеки/Тулкиты/Фреймворки 3 15.07.2011 00:13
Я как ответить на вопрос - есть ли жизнь на других планетах? TicTac Оффтопик 5 28.04.2011 04:29
Вопрос авторизации. 0931454574 Серверные языки и технологии 8 12.04.2011 11:09
Вопрос на миллион. Ajax и идентификация по адресной строке. 0931454574 AJAX и COMET 5 31.03.2011 11:54
Вопрос по замыканиям Goodfella Общие вопросы Javascript 20 09.03.2011 01:21