Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Глобальные переменные в JS (https://javascript.ru/forum/misc/60582-globalnye-peremennye-v-js.html)

mrbanan 08.01.2016 20:57

Глобальные переменные в JS
 
<div id="my"></div>

var ClickCounter = 0;

document.addEventListener("click", function(e) {
    ClickCounter++;
    document.getElementById('my').innerHTML = ClickCounter;
});

Говорят глобальные переменные это зло. Как в этом случае сделать не глобальной переменную ClickCounter?

Safort 08.01.2016 21:29

Оберни это в анонимную функцию
(function() {
  var ClickCounter = 0;
 
  document.addEventListener("click", function(e) {
      ClickCounter++;
      document.getElementById('my').innerHTML = ClickCounter;
  });
})();

Keramet 08.01.2016 21:43

Замыкание тебе в помощь :)
<!DOCTYPE html>
<html lang="ru">
  <head>
	<meta charset="UTF-8"/>
	<title>Glob</title>
	<script type="text/javascript">
		window.onload = function() {
			var ClickCounter = 0;
			
			document.addEventListener("click", function(e) {
				ClickCounter++;
				document.getElementById('my').innerHTML = ClickCounter;
			});
		};
	</script>
  </head>
  <body>
     <div id="my"></div>
  </body>
</html>

mrbanan 08.01.2016 22:04

А если она мне в других местах понадобится а не только в этой функции? Тогда сделать return ClickCounter ? Но тогда она наверное вновь станет глобальной ))

Keramet 08.01.2016 22:19

Цитата:

Сообщение от mrbanan (Сообщение 403014)
А если она мне в других местах понадобится ...

кто "она"? :lol:

mrbanan 08.01.2016 22:27

Цитата:

кто "она"
Переменная )) (она)

Safort 08.01.2016 22:28

Цитата:

Сообщение от Keramet (Сообщение 403017)
кто "она"? :lol:

Очевидно, что переменная.

Safort 08.01.2016 22:29

Цитата:

Сообщение от mrbanan (Сообщение 403014)
А если она мне в других местах понадобится а не только в этой функции? Тогда сделать return ClickCounter ? Но тогда она наверное вновь станет глобальной ))

Сохрани результат в какое-нибудь общее хранилище, которое доступно глобально и уже из него бери нужные данные.

Keramet 08.01.2016 22:38

Цитата:

Сообщение от Safort (Сообщение 403019)
Очевидно, что переменная.

не очевидно. может "она" - функция?

Keramet 08.01.2016 22:39

Цитата:

Сообщение от Safort (Сообщение 403020)
Сохрани результат в какое-нибудь общее хранилище, которое доступно глобально и уже из него бери нужные данные.

приведите, плз, пример общего хранилища

Vlasenko Fedor 08.01.2016 23:10

document и все элементы это объекты.
Вот прямо в них и пишем
document.addEventListener("click", function(e) {
      this.clickCounter = this.clickCounter++ || 1;
      document.getElementById('my').innerHTML = this.clickCounter ;
     alert(document.clickCounter);
  });

mrbanan 08.01.2016 23:35

Цитата:

приведите, плз, пример общего хранилища
Ну массив вероятно может быть таким общим хранилищем, а так, глобальные переменные доступны отовсюду

Keramet 09.01.2016 01:08

Цитата:

Сообщение от Poznakomlus (Сообщение 403025)
document и все элементы это объекты.
Вот прямо в них и пишем
document.addEventListener("click", function(e) {
      this.clickCounter = this.clickCounter++ || 1;
      document.getElementById('my').innerHTML = this.clickCounter ;
     alert(document.clickCounter);
  });

так тут clickCounter - глобальная переменная, а ТС хотел уйти от глобальности

Keramet 09.01.2016 01:09

Цитата:

Сообщение от mrbanan (Сообщение 403028)
Ну массив вероятно может быть таким общим хранилищем, а так, глобальные переменные доступны отовсюду

массив или объект, не важно.. интересно увидеть "глобальное хранилище"

Safort 09.01.2016 06:33

Цитата:

Сообщение от Keramet (Сообщение 403041)
массив или объект, не важно.. интересно увидеть "глобальное хранилище"

В простом варианте это обычный объект доступный глобально.

ruslan_mart 09.01.2016 08:14

Цитата:

Сообщение от mrbanan
А если она мне в других местах понадобится а не только в этой функции? Тогда сделать return ClickCounter ? Но тогда она наверное вновь станет глобальной ))

Обернуть все скрипты в одну общую самовызывающуюся функцию и не будет проблем.

(function(window, document) {


     //...



})(window, document);

Keramet 09.01.2016 11:46

Цитата:

Сообщение от Safort (Сообщение 403056)
В простом варианте это обычный объект доступный глобально.

Так ТС же вроде хотел избавиться от глобальной переменной

Safort 09.01.2016 12:54

Keramet,
совсем без глобальных переменных не получится. А данный способ поможет сильно сократить их количество.


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