как сделать грамотно?
Всем привет!
В своих поделках у меня частенько проскакивает код типа: //это типа глобальная переменная 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, время: 04:46. |