как сделать грамотно?
Всем привет!
В своих поделках у меня частенько проскакивает код типа:
//это типа глобальная переменная
var counter=0;
function DoSomeWork(){
/*...что то еще*/
if(count == A)
{
//как то изменяем глобальную переменную:
counter ++;
//что то делаем еще:
/*
...some code
*/
}
}
В общем состояние храниться в глобальной переменной. Маразмом я таким знаимаюсь, например, если пользователь не должен иметь возможность выделить больше трех checkbox`офф в форме. Я считаю что это некрасиво, но ничего умнее не придумал. Как избавиться от глобальной переменной? Мне кажется тут должны пригодится замыкания, но что-то мне не хватило мозгу понять как их припилить к этому. |
Лучше перейти к объектно-ориентированности. Но если приложение небольшое, то можно и замыкания. Как вариант
var doSomeWork = (function() {
var counter = 0;
return function() {
// код функции
}
})();
|
DoSomeWork.counter = 0;
функция тоже объект. |
Цитата:
|
Цитата:
counter относиться к функции, так почему бы ему не быть её свойством? не понимаю вашего упрёка. |
Цитата:
Вариант с замыканием мне кажется более элегантным. Аналогичный пример можно привести с добавлением в DOM-элемент своих свойств. Я предпочитаю обходиться без этого. Тем более что осел преобразует их в атрибуты и если в дальнейшем мы будет их обрабатывать, могут возникнуть проблемы. |
Цитата:
Цитата:
|
Цитата:
Цитата:
|
Цитата:
DoSomeWork.vars = {};
DoSomeWork.vars.counter = 0;
|
Цитата:
|
B~Vladi,
Не делайте из мухи СЛОНА. Я прекрасно понимаю что вы говорите о расширяемости. Однако здесь речь идет не об этом. Цитата:
|
Цитата:
Цитата:
|
Цитата:
|
Я обычно делаю так:
<button onclick="run()">run()</button>
<script type="text/javascript">
function run(){
if (!arguments.callee.runTimes) arguments.callee.runTimes = 0;
if (++arguments.callee.runTimes > 3){
alert("Эту функцию можно вызвать только три раза!");
return;
};
/* далее — обычный код функции */
alert("Я сработало!")
}
</script>
Ну, учитывая, что arguments.callee — это ссылка на функцию, которая сейчас выполняется. |
Как аргумент против свойств функции: они не сожмутся обфускатором. Но это не для всех аргумент :)
|
subzey,
может так ? if (++arguments.callee.runTimes < 4){ alert("Эту функцию можно вызвать только три раза!"); return; }; или if (arguments.callee.runTimes++ < 3){ alert("Эту функцию можно вызвать только три раза!"); return; }; |
рони,
«Эту функцию первые три раза запускать нельзя»? :) |
subzey,
ок понял |
| Часовой пояс GMT +3, время: 11:41. |