16.06.2015, 15:59
|
|
Кандидат Javascript-наук
|
|
Регистрация: 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>
|
|
16.06.2015, 16:00
|
|
Кандидат Javascript-наук
|
|
Регистрация: 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>
|
|
17.06.2015, 09:00
|
Профессор
|
|
Регистрация: 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 раз.
|
|
17.06.2015, 09:09
|
|
Кандидат Javascript-наук
|
|
Регистрация: 14.06.2014
Сообщений: 137
|
|
Здорово!
Спасибо огромное за консультацию. Много нового узнал.
|
|
17.06.2015, 09:16
|
Профессор
|
|
Регистрация: 12.12.2012
Сообщений: 1,398
|
|
demoniqus,
Не учи плохому, в строках 2 и 3 вар написать всё же стоит.
|
|
17.06.2015, 09:31
|
Профессор
|
|
Регистрация: 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 этого не требует?
|
|
17.06.2015, 09:38
|
Профессор
|
|
Регистрация: 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.
|
|
17.06.2015, 10:47
|
Профессор
|
|
Регистрация: 28.05.2008
Сообщений: 182
|
|
Да, про строгий режим я не думал... В этом случае согласен. Но, если не предполагается работа в строгом режиме, то в таком случае, на мой взгляд, var становится просто мусором, загрязняющим код и делающим его менее читабельным (из-за этого var можно принять глобальную переменную за локальную и потом долго отлавливать ошибки)))) )
Про чрезмерное использование глобальных переменных - тут вообще пофиг какой режим: строгий или "лояльный" - чем их меньше, тем лучше))))
Что же до случайного переопределения глобальной переменной, то var не всегда поможет - все зависит от доступности данной глобальной переменной на изменение. Я для теста подключил тот же jQuery, а потом через var $ = 'fvbfdbgvfd' спокойно заменил значение... window.Math - тоже поддался изменению...
Про стандарт же и использование безVARного объявления для обратной совместимости запомню))) Хотя тут же возникает вопрос: если стандарт предписывает все же объявлять переменную через var, то как, находясь внутри функции, объявить именно глобальную переменную? Только без var это и можно сделать...
Последний раз редактировалось demoniqus, 17.06.2015 в 10:50.
|
|
17.06.2015, 11:03
|
Профессор
|
|
Регистрация: 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.
|
|
17.06.2015, 11:27
|
Профессор
|
|
Регистрация: 28.05.2008
Сообщений: 182
|
|
1) Согласен. И тут еще одно замечание про неломаемость ни при каких обстоятельствах. Следование стандартам языка - это хорошо (если бы еще во всех даже современных браузерах эти стандарты поддерживались бы нормально), но чаще я напарывался на ситуации, когда код писался под частный случай (типа "Давай быстрее!!! Мне не надо универсальности!!!"), а потом условия менялись заказчиком и код переставал работать корректно... или просто работать. Вывод: для повышения устойчивости кода нужно как можно меньше в нем делать ограничений.
3) Использую глобальные переменные лишь при крайней необходимости. Ведь, как ни крути, но довольно затруднительно написать серьезное приложение, не использовав ни одной глобальной переменной (ни одного глобального хранилища локальных переменных, через которое к ним можно ото всюду получить доступ). Так что этот показатель у меня не 2/3, а скорее 2/333 и меньше...)))) Конечно, если очень постараться, то можно его еще сократить или вообще свести в ноль, но овчинка уже выделки не стоит.
2) 4) У автора все переменные заданы именно вне функций и каких-либо хранилищ))))) Вот если бы все это обернул, скажем, в лоадер-функцию, тогда ...
5) Хоть сам и грешу, зачастую опуская window при обращении к глобальным переменным, но согласен, что так правильнее было бы...
ЗЫ Век живи, век учись... Мои знания сегодня еще расширились.
|
|
|
|