Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.06.2015, 15:59
Аватар для qwe88
Кандидат Javascript-наук
Отправить личное сообщение для qwe88 Посмотреть профиль Найти все сообщения от qwe88
 
Регистрация: 14.06.2014
Сообщений: 137

Остановка 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>
Ответить с цитированием
  #2 (permalink)  
Старый 16.06.2015, 16:00
Аватар для qwe88
Кандидат Javascript-наук
Отправить личное сообщение для qwe88 Посмотреть профиль Найти все сообщения от qwe88
 
Регистрация: 14.06.2014
Сообщений: 137

Разобрался. всем спасибо))
<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>
Ответить с цитированием
  #3 (permalink)  
Старый 17.06.2015, 09:00
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

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

Во-первых, в данном случае не надо использовать ключевое слово var, т.к. все переменные ты объявляешь вне функции, т.е. в ГЛОБАЛЬНОЙ области видимости.
Во-вторых, для уменьшения размера кода создаваемой функции хорошо использовать префиксный инкремент ИНКРЕМЕНТ
В-третьих, по возможности лучше для сравнения в циклах использовать строгое сравнение - разница в скорости может различаться в 7 раз.
Ответить с цитированием
  #4 (permalink)  
Старый 17.06.2015, 09:09
Аватар для qwe88
Кандидат Javascript-наук
Отправить личное сообщение для qwe88 Посмотреть профиль Найти все сообщения от qwe88
 
Регистрация: 14.06.2014
Сообщений: 137

Здорово!
Спасибо огромное за консультацию. Много нового узнал.
Ответить с цитированием
  #5 (permalink)  
Старый 17.06.2015, 09:16
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

demoniqus,
Не учи плохому, в строках 2 и 3 вар написать всё же стоит.
Ответить с цитированием
  #6 (permalink)  
Старый 17.06.2015, 09:31
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

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 этого не требует?
Ответить с цитированием
  #7 (permalink)  
Старый 17.06.2015, 09:38
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

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

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

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

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


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

Последний раз редактировалось tsigel, 17.06.2015 в 09:41.
Ответить с цитированием
  #8 (permalink)  
Старый 17.06.2015, 10:47
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

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

Последний раз редактировалось demoniqus, 17.06.2015 в 10:50.
Ответить с цитированием
  #9 (permalink)  
Старый 17.06.2015, 11:03
Профессор
Отправить личное сообщение для tsigel Посмотреть профиль Найти все сообщения от tsigel
 
Регистрация: 12.12.2012
Сообщений: 1,398

Сообщение от 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.

Последний раз редактировалось tsigel, 17.06.2015 в 11:14.
Ответить с цитированием
  #10 (permalink)  
Старый 17.06.2015, 11:27
Профессор
Отправить личное сообщение для demoniqus Посмотреть профиль Найти все сообщения от demoniqus
 
Регистрация: 28.05.2008
Сообщений: 182

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

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация JS WeMeSder Общие вопросы Javascript 0 13.06.2014 23:51
setInterval и глобальные переменные Почемучкин Events/DOM/Window 11 11.08.2012 14:44
confirm, остановка setInterval псевдочеловек Общие вопросы Javascript 5 03.07.2011 14:15
остановка выполнения setInterval olejan Общие вопросы Javascript 7 16.05.2011 23:19
setTimeout setInterval и др. mycoding Общие вопросы Javascript 6 28.10.2010 17:26