Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Вопрос по замыканию (https://javascript.ru/forum/misc/77295-vopros-po-zamykaniyu.html)

Иса Мирзоев 15.04.2019 18:36

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

Вот пример.

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 19:14

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

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

О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

рони 15.04.2019 19:16

Иса Мирзоев,
ничего не понял, подожду специалистов.

Белый шум 15.04.2019 21:17

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.: а почему перестал работать запуск кода на сайте? Или это только у меня?

рони 15.04.2019 21:31

Белый шум,
как временый выход добавить теги script и обернуть в <> , видимо с тегом
[js run]
проблема, используйте
[html run]<script>...

Иса Мирзоев 15.04.2019 21:48

Все отлично))
 
Цитата:

Сообщение от Белый шум (Сообщение 506583)
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 23:02

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

Aetae 15.04.2019 23:38

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

counter();

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

Но на самом деле так делать не надо.)
Если вам нужны глобальные переменные - значит вы с гарантией делаете что-то не так.

Иса Мирзоев 16.04.2019 00:04

Цитата:

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

counter();

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

Но на самом деле так делать не надо.)
Если вам нужны глобальные переменные - значит вы с гарантией делаете что-то не так.

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

Белый шум 16.04.2019 02:27

Цитата:

Сообщение от рони (Сообщение 506590)
Белый шум,
отпишись, работает ли в песочнице скрипт сейчас?

Да, сейчас сработало.


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