10.08.2012, 06:19
|
Профессор
|
|
Регистрация: 11.05.2011
Сообщений: 241
|
|
setInterval и глобальные переменные
При попытке обращения к внешней переменной (даже для проверки), выражение в setInterval прекращает работу.
Например
var my_counter = 0;
setInterval( " if(my_counter) {my_counter++}; ", 5000 );
или
setInterval( function(){ alert(my_counter); }, 5000 );
Даже при проверке на null выражение прерывается. Не всегда удобно отказываться от переменной.
Вопрос: можно ли как-то работать с глобальными переменными из setInterval и setTimer ?
|
|
10.08.2012, 07:45
|
|
Студент
|
|
Регистрация: 30.04.2012
Сообщений: 1,113
|
|
var my_counter = 0;
setInterval( function(){ my_counter++;alert(my_counter); }, 5000 );
|
|
10.08.2012, 15:41
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
if (el) означает
http://ir2.ru/javascript-if.aspx
Цитата:
|
if (el != "" && el != 0 && el != false && el != null && el != undefined)
|
(интересно знать в каком порядке)
В официальной документации возможно такой вывод делается отсюда http://es5.javascript.ru/x12.html#x12.5 и следовательно отсюда http://es5.javascript.ru/x9.html#x9.2, хотя может быть где-то и явно это указано.
Поэтому код в первом setInterval никогда не изменит показание счётчика, хотя сам setInterval будет всегда выполнятся.
А второй пример рабочий: через 5с будет выводиться 0 через alert.
Последний раз редактировалось bes, 10.08.2012 в 15:44.
|
|
10.08.2012, 23:17
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от bes
|
if (el) означает
http://ir2.ru/javascript-if.aspx
Цитата:
if (el != "" && el != 0 && el != false && el != null && el != undefined)
(интересно знать в каком порядке)
|
Это неверно по 3 причинам:
1) равенства написаны нестрогие, а не строгие;
2) забыли о NaN;
3) el может быть свойством доступа и его геттер может творить, что хочет.
if (el)
на самом деле эквивалентно
if (function (v) {
return v!==void 0&&v!==null&&v!==false&&v!==0&&v==v&&v!=="";
}(el))
|
|
10.08.2012, 23:27
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
oneguy, процитировал, откуда взял, интересует место в официальном источнике, где это указано
|
|
10.08.2012, 23:28
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Сообщение от bes
|
интересует официальный источник, где это указано
|
Так вы уже ведь привели ссылки на спецификацию, где это сказано.
|
|
10.08.2012, 23:32
|
|
I am Student
|
|
Регистрация: 17.12.2011
Сообщений: 4,415
|
|
чет я не понял сути проблемы, все работает
var counter = 0;
setInterval( function(){counter++; alert(counter); }, 2000 );
|
|
10.08.2012, 23:35
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Сообщение от oneguy
|
Так вы уже ведь привели ссылки на спецификацию, где это сказано.
|
По тем ссылкам, что я привел, явно этого не указано, если делать такой вывод из таблицы "Преобразования ToBoolean" то, например, о строгом или нестрогом неравенстве вывод тоже непонятно как получить.
|
|
10.08.2012, 23:55
|
Профессор
|
|
Регистрация: 31.05.2012
Сообщений: 396
|
|
Мой пример с function я сам придумал, он нигде не указан. Первая причина в моём замечании по поводу примера с нестрогими сравнениями является серьёзной ошибкой, примеры:
1) "0" приводится к true, а "0"!=0 возвращает false;
2) new String() приводится к true, а new String()!="" возвращает false;
Поскольку, если заменить все != на !==, пример будет больше похож на правду, я решил, что автор имел ввиду строгие сравнения.
Если надо, могу ссылку на описание алгоритмов сравнения в спецификации.
|
|
11.08.2012, 10:16
|
|
Профессор
|
|
Регистрация: 22.03.2012
Сообщений: 3,744
|
|
Понятно, данное соотношение получено экспериментальным путём
|
|
|
|