Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.06.2010, 12:51
Новичок на форуме
Отправить личное сообщение для _mad Посмотреть профиль Найти все сообщения от _mad
 
Регистрация: 16.06.2010
Сообщений: 9

как сделать грамотно?
Всем привет!

В своих поделках у меня частенько проскакивает код типа:

//это типа глобальная переменная
var counter=0;

function DoSomeWork(){
/*...что то еще*/

if(count == A)
  {
   //как то изменяем глобальную переменную:
   counter ++;
   
   //что то делаем еще:
   /*
   ...some code
   */
  }

}


В общем состояние храниться в глобальной переменной. Маразмом я таким знаимаюсь, например, если пользователь не должен иметь возможность выделить больше трех checkbox`офф в форме.

Я считаю что это некрасиво, но ничего умнее не придумал. Как избавиться от глобальной переменной? Мне кажется тут должны пригодится замыкания, но что-то мне не хватило мозгу понять как их припилить к этому.
Ответить с цитированием
  #2 (permalink)  
Старый 16.06.2010, 12:59
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Лучше перейти к объектно-ориентированности. Но если приложение небольшое, то можно и замыкания. Как вариант
var doSomeWork = (function() {
    var counter = 0;
    return function() {
        // код функции
    }
})();
Ответить с цитированием
  #3 (permalink)  
Старый 16.06.2010, 20:57
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

DoSomeWork.counter = 0;
функция тоже объект.
Ответить с цитированием
  #4 (permalink)  
Старый 20.06.2010, 00:11
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Gozar
функция тоже объект.
Это не значит что её нужно засирать.
Ответить с цитированием
  #5 (permalink)  
Старый 20.06.2010, 12:23
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от B~Vladi Посмотреть сообщение
Это не значит что её нужно засирать.
В каком смысле?
counter относиться к функции, так почему бы ему не быть её свойством?
не понимаю вашего упрёка.
Ответить с цитированием
  #6 (permalink)  
Старый 20.06.2010, 12:44
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Gozar
counter относиться к функции, так почему бы ему не быть её свойством?
А если переменных будет больше? Все что ли туда совать? Если какое-то свойство по имени совпадет с уже существующим?
Вариант с замыканием мне кажется более элегантным.
Аналогичный пример можно привести с добавлением в DOM-элемент своих свойств. Я предпочитаю обходиться без этого. Тем более что осел преобразует их в атрибуты и если в дальнейшем мы будет их обрабатывать, могут возникнуть проблемы.
Ответить с цитированием
  #7 (permalink)  
Старый 20.06.2010, 13:37
Аватар для Gozar
Отправить личное сообщение для Gozar Посмотреть профиль Найти все сообщения от Gozar
 
Регистрация: 07.06.2007
Сообщений: 7,504

Сообщение от B~Vladi Посмотреть сообщение
Аналогичный пример можно привести с добавлением в DOM-элемент своих свойств. Я предпочитаю обходиться без этого. Тем более что осел преобразует их в атрибуты и если в дальнейшем мы будет их обрабатывать, могут возникнуть проблемы.
Пример с DOM я считаю совсем не аналогичный. Это пользовательская функция, и проблем вышеописанных с ней нет.

Сообщение от B~Vladi Посмотреть сообщение
А если переменных будет больше? Все что ли туда совать? Если какое-то свойство по имени совпадет с уже существующим?
Для данного случая пример имеет право на жизнь, по крайней мере он решает проблему с областью видимости, а обсуждать глобальные проблемы, пока их нет, не вижу смысла.
Ответить с цитированием
  #8 (permalink)  
Старый 20.06.2010, 13:43
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от Gozar
Для данного случая пример имеет право на жизнь, по крайней мере он решает проблему с областью видимости, а обсуждать глобальные проблемы, пока их нет, не вижу смысла.
Только для данного случая. Если код будет расширятся, придется многое переписывать с таким подходом. Лучше сразу делать делать так, чтобы в будущем не возникало геморроя. Поэтому обсуждать нужно сразу все варианты.
Сообщение от Gozar
Пример с DOM я считаю совсем не аналогичный. Это пользовательская функция, и проблем вышеописанных с ней нет.
Да, таких проблем нет, но если привыкнуть хранить данные в неположенных местах, проблемы легко могут появиться (как правило в совсем неподходящий момент).
Ответить с цитированием
  #9 (permalink)  
Старый 20.06.2010, 13:50
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Сообщение от B~Vladi
А если переменных будет больше? Все что ли туда совать? Если какое-то свойство по имени совпадет с уже существующим?
DoSomeWork.vars = {};
DoSomeWork.vars.counter = 0;
Ответить с цитированием
  #10 (permalink)  
Старый 20.06.2010, 14:12
Аватар для B~Vladi
Модератор Всея Форума
Отправить личное сообщение для B~Vladi Посмотреть профиль Найти все сообщения от B~Vladi
 
Регистрация: 14.05.2009
Сообщений: 4,021

Сообщение от B@rmaley.e><e
DoSomeWork.vars = {};
DoSomeWork.vars.counter = 0;
Да пожалуйста, пишите так. Рано или поздно это аукнется. Не дай бог мне работать в команде с такими кодерами.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать такое fancy menu uonax Элементы интерфейса 2 22.05.2010 12:52
30(1|2) редирект от сервера. Или как лучше сделать редирект при верной отсылке форма. pizzZ AJAX и COMET 2 18.02.2010 09:06
Вопрос как сделать эту панельку Определённых размеров и свойств. jei jQuery 3 09.06.2009 19:14
Как сделать электронный каталог продукции? natarius Серверные языки и технологии 6 24.05.2009 20:56
Как сделать, чтобы 2 ссылки отображались как hover при наведении мышкой на любую? Ava Элементы интерфейса 5 19.05.2009 23:24