Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   setInterval и глобальные переменные (https://javascript.ru/forum/events/30620-setinterval-i-globalnye-peremennye.html)

Почемучкин 10.08.2012 06:19

setInterval и глобальные переменные
 
При попытке обращения к внешней переменной (даже для проверки), выражение в setInterval прекращает работу.

Например
var my_counter = 0;

setInterval( " if(my_counter) {my_counter++}; ", 5000 );
или
setInterval( function(){ alert(my_counter); }, 5000 );


Даже при проверке на null выражение прерывается. Не всегда удобно отказываться от переменной.

Вопрос: можно ли как-то работать с глобальными переменными из setInterval и setTimer ?

vadim5june 10.08.2012 07:45

var my_counter = 0;
setInterval( function(){ my_counter++;alert(my_counter); }, 5000 );

bes 10.08.2012 15:41

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.

oneguy 10.08.2012 23:17

Цитата:

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

bes 10.08.2012 23:27

oneguy, процитировал, откуда взял, интересует место в официальном источнике, где это указано

oneguy 10.08.2012 23:28

Цитата:

Сообщение от bes
интересует официальный источник, где это указано

Так вы уже ведь привели ссылки на спецификацию, где это сказано.

cyber 10.08.2012 23:32

чет я не понял сути проблемы, все работает
var counter = 0;


setInterval( function(){counter++; alert(counter); }, 2000 );

bes 10.08.2012 23:35

Цитата:

Сообщение от oneguy
Так вы уже ведь привели ссылки на спецификацию, где это сказано.

По тем ссылкам, что я привел, явно этого не указано, если делать такой вывод из таблицы "Преобразования ToBoolean" то, например, о строгом или нестрогом неравенстве вывод тоже непонятно как получить.

oneguy 10.08.2012 23:55

Мой пример с function я сам придумал, он нигде не указан. Первая причина в моём замечании по поводу примера с нестрогими сравнениями является серьёзной ошибкой, примеры:
1) "0" приводится к true, а "0"!=0 возвращает false;
2) new String() приводится к true, а new String()!="" возвращает false;
Поскольку, если заменить все != на !==, пример будет больше похож на правду, я решил, что автор имел ввиду строгие сравнения.
Если надо, могу ссылку на описание алгоритмов сравнения в спецификации.

bes 11.08.2012 10:16

Понятно, данное соотношение получено экспериментальным путём


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