Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Остановка setInterval (https://javascript.ru/forum/misc/56442-ostanovka-setinterval.html)

qwe88 16.06.2015 15:59

Остановка setInterval
 
Добрый день!
Учусь писать отсчет. Цифры бегают, но как остановить не понимаю.
Помогите, пожалуйста.

<div id="prel"></div>
    <script>
        var prel = document.getElementById("prel");

        var nul = 0;

        function lu(){
            nul = nul + 1;
            prel.innerHTML = nul;
        }

        var bub = setInterval(lu, 11);

        if(nul == 100){
            clearInterval(bub);
        }
    </script>

qwe88 16.06.2015 16:00

Разобрался. всем спасибо))
<div id="prel"></div>
    <script>
        var prel = document.getElementById("prel");

        var nul = 0;

        function lu(){
            nul = nul + 1;
            prel.innerHTML = nul;

            if(nul == 100){
                clearInterval(bub);
            }
        }

        var bub = setInterval(lu, 11);


    </script>

demoniqus 17.06.2015 09:00

несколько улучшений и поправок
<script>
  prel = document.getElementById("prel");
  nul = 0;
  function lu(){
    prel.innerHTML = ++nul;
    nul === 100 && clearInterval(bub);
  }
  bub = setInterval(lu, 40);
</script>

Во-первых, в данном случае не надо использовать ключевое слово var, т.к. все переменные ты объявляешь вне функции, т.е. в ГЛОБАЛЬНОЙ области видимости.
Во-вторых, для уменьшения размера кода создаваемой функции хорошо использовать префиксный инкремент ИНКРЕМЕНТ
В-третьих, по возможности лучше для сравнения в циклах использовать строгое сравнение - разница в скорости может различаться в 7 раз.

qwe88 17.06.2015 09:09

Здорово!
Спасибо огромное за консультацию. Много нового узнал.

tsigel 17.06.2015 09:16

demoniqus,
Не учи плохому, в строках 2 и 3 вар написать всё же стоит.

demoniqus 17.06.2015 09:31

tsigel, почему плохому? Сейчас специально проверил:
<script type="text/javascript">
        var tempVariable = 'some_var';
        $(function(){
            console.log(window.tempVariable);
        });
    </script>

и
<script type="text/javascript">
        tempVariable = 'some_var';
        $(function(){
            console.log(window.tempVariable);
        });
    </script>

результат одинаковый. Или все равно такие переменные обладают какими-либо особенностями?)))

И чем строки 2 и 3 отличаются от объявления переменной bub, что их надо объявлять через var, а bub этого не требует?

tsigel 17.06.2015 09:38

Цитата:

Сообщение от demoniqus
И чем строки 2 и 3 отличаются от объявления переменной bub, что их надо объявлять через var, а bub этого не требует?

Там тоже надо, просто тогда её ещё надо поднять наверх, а я с мобилы писал.

В строгом режиме ваш второй код работать не будет (потому как нельзя объявлять переменные без var).

В общем уже есть бесчисленное множество холиваров на тему вар, но если всегда писать вар, то:
1) Нельзя случайно переопределить глобальную переменную
2) Много глобальных переменных - это вообще плохо
3) С вар - более правильно так как это стандарт спецификации и без вар работает только из-за совместимости со старыми браузерами.

'use strict';
try {
  a = 10;
} catch (e) {
  alert(e);
}


Написание кода в строгом режиме - это вообще хороший тон и уменьшение вероятности необычных ошибок.

demoniqus 17.06.2015 10:47

Да, про строгий режим я не думал... В этом случае согласен. Но, если не предполагается работа в строгом режиме, то в таком случае, на мой взгляд, var становится просто мусором, загрязняющим код и делающим его менее читабельным (из-за этого var можно принять глобальную переменную за локальную и потом долго отлавливать ошибки)))) )
Про чрезмерное использование глобальных переменных - тут вообще пофиг какой режим: строгий или "лояльный" - чем их меньше, тем лучше))))
Что же до случайного переопределения глобальной переменной, то var не всегда поможет - все зависит от доступности данной глобальной переменной на изменение. Я для теста подключил тот же jQuery, а потом через var $ = 'fvbfdbgvfd' спокойно заменил значение... window.Math - тоже поддался изменению...
Про стандарт же и использование безVARного объявления для обратной совместимости запомню))) Хотя тут же возникает вопрос: если стандарт предписывает все же объявлять переменную через var, то как, находясь внутри функции, объявить именно глобальную переменную? Только без var это и можно сделать...

tsigel 17.06.2015 11:03

Цитата:

Сообщение от demoniqus
Но, если не предполагается работа в строгом режиме, то в таком случае, на мой взгляд, var становится просто мусором, загрязняющим код и делающим его менее читабельным (из-за этого var можно принять глобальную переменную за локальную и потом долго отлавливать ошибки)))) )
Про чрезмерное использование глобальных переменных - тут вообще пофиг какой режим: строгий или "лояльный" - чем их меньше, тем лучше))))
Что же до случайного переопределения глобальной переменной, то var не всегда поможет - все зависит от доступности данной глобальной переменной на изменение. Я для теста подключил тот же jQuery, а потом через var $ = 'fvbfdbgvfd' спокойно заменил значение... window.Math - тоже поддался изменению...
Про стандарт же и использование безVARного объявления для обратной совместимости запомню))) Хотя тут же возникает вопрос: если стандарт предписывает все же объявлять переменную через var, то как, находясь внутри функции, объявить именно глобальную переменную? Только без var это и можно сделать...

1) Если не предполагается работа в строгом режиме и если вы работаете только как 1 разработчик. Вы всегда должны писать устойчивый код который не сломается ни при каких обстоятельствах (неважно включил другой разработчик строгий режим или нет). Это просто дает возможность командной разработки. Лучше сразу учиться писать правильно, а не переучиваться.

2) "var" не может стать мусором загрязняющим код как и любой другой оператор. Это синтаксис языка которому надо следовать. Он не может ни запутать, ни сделать код менее читабильным. Это тоже самое что говорить что if () {} else {} - загрязняющая код конструкция (не надо сейчас говорить что это можно заменить на тернарные операторы или писать без фигурных скобок, я лишь хочу сказать что синтаксис языка не делает код нечитабильным. Исключение - те кто не знает как писать правильно.)

3) Вы согласились что глобальные переменные - плохо, тогда получается что в 2/3 случаев вы всетаки пишите его. Должно быть единообразие - это просто хороший тон - писать все в одном стиле.

4) "потом через var $ = 'fvbfdbgvfd' спокойно заменил значение... window.Math - тоже поддался изменению..." - именно об этом я и говорил - в локальных функциях надо всегда писать вар чтобы не испортить глобальные переменные.

5) "Хотя тут же возникает вопрос: если стандарт предписывает все же объявлять переменную через var, то как, находясь внутри функции, объявить именно глобальную переменную? Только без var это и можно сделать..." чтобы создать/изменить глобальную переменную из функции можно обратиться к window, это даст читающему код понять что это именно глобальная переменная а не просто переменная родитльского scope.

demoniqus 17.06.2015 11:27

1) Согласен. И тут еще одно замечание про неломаемость ни при каких обстоятельствах. Следование стандартам языка - это хорошо (если бы еще во всех даже современных браузерах эти стандарты поддерживались бы нормально), но чаще я напарывался на ситуации, когда код писался под частный случай (типа "Давай быстрее!!! Мне не надо универсальности!!!"), а потом условия менялись заказчиком и код переставал работать корректно... или просто работать. Вывод: для повышения устойчивости кода нужно как можно меньше в нем делать ограничений.
3) Использую глобальные переменные лишь при крайней необходимости. Ведь, как ни крути, но довольно затруднительно написать серьезное приложение, не использовав ни одной глобальной переменной (ни одного глобального хранилища локальных переменных, через которое к ним можно ото всюду получить доступ). Так что этот показатель у меня не 2/3, а скорее 2/333 и меньше...)))) Конечно, если очень постараться, то можно его еще сократить или вообще свести в ноль, но овчинка уже выделки не стоит.
2) 4) У автора все переменные заданы именно вне функций и каких-либо хранилищ))))) Вот если бы все это обернул, скажем, в лоадер-функцию, тогда ...
5) Хоть сам и грешу, зачастую опуская window при обращении к глобальным переменным, но согласен, что так правильнее было бы...

ЗЫ Век живи, век учись... Мои знания сегодня еще расширились.


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