Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Обратный таймер (https://javascript.ru/forum/misc/23957-obratnyjj-tajjmer.html)

trikadin 15.12.2011 13:43

Цитата:

Сообщение от nerv_
Объясните, пожалуйста, на примере вашей первой функции, как сделать так, чтобы в глобальной области видимости находилась только одна функция, а не кол-во функций + кол-во глобальных переменных?

Через анонимную ф-цию:

var global, globalMethod; // объявляем глобальные переменные
(function(){ // создаём анонимную ф-цию
var local= 2; // локальная переменная
global= 3;
globalMethod= function() {
 alert(local + " + " + global + " = " + (local+global));
};
})() // вызываем анонимную ф-цию
globalMethod();
alert(local);

nerv_ 15.12.2011 17:26

trikadin, очередное мерси :yes: Вроде как пример простой и на первый взгляд понятный, но я все равно пару раз прогнал его в отладчике пошагово, чтобы в голове отложилось :) Кажется, понял, почему у меня не получалось) Если не ошибаюсь, тут используется т.н. "статическая приватная" переменная благодаря замыканию анонимной ф-ции на globalMethod.

trikadin 15.12.2011 17:30

Полезно будет почитать про фабрики объектов - суть примерно та же.

рони 16.12.2011 07:14

Цитата:

Сообщение от nerv_
Объясните, пожалуйста, на примере вашей первой функции, как сделать так, чтобы в глобальной области видимости находилась только одна функция, а не кол-во функций + кол-во глобальных переменных?

Вариант всё тоже самое но все переменные и функции в одном обьекте ...
<html>
	<head>
		<meta charset="utf-8">
		<style type="text/css">
			body { background-color:#ffcc33; margin:0px; }
			div { color:#0033cc; font:bold 12pt Tahoma; margin:15px; }
		</style>
		<script type="text/javascript">
  var T = {
    n: null,
    s: new Date,
    f: 1,
    t: new Date,
    Timer: function () {
        T.t = new Date(T.t.getTime() + T.f * ((new Date).getTime() - T.s.getTime()));
        document.getElementsByTagName("div")[0].innerHTML = T.t.toLocaleTimeString();
        T.s = new Date;
        T.n = setTimeout(function () {
            T.Timer()
        }, 500)
    },
    New_start: function () {
        clearTimeout(T.n);
        T.t.setHours(0, 0, 0, 0);
        T.s = new Date;
        T.Timer()
    },
    Pause: function () {
        T.s ? (clearTimeout(T.n), T.s = "") : (T.s = new Date, T.Timer())
    },
    BackTimer: function () {
        clearTimeout(T.n);
        T.f = -T.f;
        T.s = new Date;
        T.Timer()
    },
    Set: function () {
        var a = parseInt(document.getElementById("sec").value, 10) || 0;
        T.t.setHours(0, 0, a, 0);
        document.getElementsByTagName("div")[0].innerHTML = T.t.toLocaleTimeString()
    }
};
		</script>
	</head>
	<body>
		<input type="button" onclick="T['New_start']()" value="Start/New">
		<input type="button" onclick="T['Pause']()" value="Pause/Go">
        <input type="button" onclick="T['BackTimer']();" value="BackTimer">
        <input type="button" onclick="T['Set']();" value="Set">
        <label><input type="text" value="30" id="sec">sec</label>
        <div>Div HTML</div>
    </body>
</html>

Livanderiaamarum 16.12.2011 07:59

я ща спать, а завтра сделаю самый лучший таймер из всех возможных))

Solovei95 16.12.2011 08:03

Это невозможно! Нужно тогда брать конкретное время, и отсчитывать.

trikadin 16.12.2011 14:38

Цитата:

Сообщение от Solovei95
Это невозможно! Нужно тогда брать конкретное время, и отсчитывать.

Что невозможно-то? Тут уже всё сделали)

nerv_ 16.12.2011 15:34

рони, благодарю! :yes: Разрешите полюбопытствовать, почему Вы обращаетесь к методам этим способом
<input type="button" onclick="T['New_start']()" value="Start/New">
// а не этим?
<input type="button" onclick="T.New_start();" value="Start/New">

Livanderiaamarum 16.12.2011 15:51

Цитата:

Сообщение от nerv_ (Сообщение 143436)
рони, благодарю! :yes: Разрешите полюбопытствовать, почему Вы обращаетесь к методам этим способом
<input type="button" onclick="T['New_start']()" value="Start/New">
// а не этим?
<input type="button" onclick="T.New_start();" value="Start/New">

привычка наверное))

trikadin 16.12.2011 15:53

Цитата:

Сообщение от Livanderiaamarum
привычка наверное))

Ну, так ещё делается для борьбы с обфускацией названий методов. Хотя в атрибуте это неоправданно,имхо.


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