Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.08.2012, 05: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 ?
Ответить с цитированием
  #2 (permalink)  
Старый 10.08.2012, 06:45
Аватар для vadim5june
Студент
Отправить личное сообщение для vadim5june Посмотреть профиль Найти все сообщения от vadim5june
 
Регистрация: 30.04.2012
Сообщений: 1,113

var my_counter = 0;
setInterval( function(){ my_counter++;alert(my_counter); }, 5000 );
Ответить с цитированием
  #3 (permalink)  
Старый 10.08.2012, 14:41
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,745

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 в 14:44.
Ответить с цитированием
  #4 (permalink)  
Старый 10.08.2012, 22:17
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 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))
Ответить с цитированием
  #5 (permalink)  
Старый 10.08.2012, 22:27
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,745

oneguy, процитировал, откуда взял, интересует место в официальном источнике, где это указано
Ответить с цитированием
  #6 (permalink)  
Старый 10.08.2012, 22:28
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Сообщение от bes
интересует официальный источник, где это указано
Так вы уже ведь привели ссылки на спецификацию, где это сказано.
Ответить с цитированием
  #7 (permalink)  
Старый 10.08.2012, 22:32
Аватар для cyber
I am Student
Отправить личное сообщение для cyber Посмотреть профиль Найти все сообщения от cyber
 
Регистрация: 16.12.2011
Сообщений: 4,415

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


setInterval( function(){counter++; alert(counter); }, 2000 );
Ответить с цитированием
  #8 (permalink)  
Старый 10.08.2012, 22:35
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,745

Сообщение от oneguy
Так вы уже ведь привели ссылки на спецификацию, где это сказано.
По тем ссылкам, что я привел, явно этого не указано, если делать такой вывод из таблицы "Преобразования ToBoolean" то, например, о строгом или нестрогом неравенстве вывод тоже непонятно как получить.
Ответить с цитированием
  #9 (permalink)  
Старый 10.08.2012, 22:55
Профессор
Отправить личное сообщение для oneguy Посмотреть профиль Найти все сообщения от oneguy
 
Регистрация: 31.05.2012
Сообщений: 396

Мой пример с function я сам придумал, он нигде не указан. Первая причина в моём замечании по поводу примера с нестрогими сравнениями является серьёзной ошибкой, примеры:
1) "0" приводится к true, а "0"!=0 возвращает false;
2) new String() приводится к true, а new String()!="" возвращает false;
Поскольку, если заменить все != на !==, пример будет больше похож на правду, я решил, что автор имел ввиду строгие сравнения.
Если надо, могу ссылку на описание алгоритмов сравнения в спецификации.
Ответить с цитированием
  #10 (permalink)  
Старый 11.08.2012, 09:16
Аватар для bes
bes bes вне форума
Профессор
Отправить личное сообщение для bes Посмотреть профиль Найти все сообщения от bes
 
Регистрация: 22.03.2012
Сообщений: 3,745

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Глобальные переменные в jquery IHB jQuery 11 20.02.2013 11:37
глобальные переменные сайта и js leko Общие вопросы Javascript 8 01.07.2012 09:53
Глобальные переменные kilogram Серверные языки и технологии 3 30.03.2012 14:59
глобальные и локальные переменные San4ezy Элементы интерфейса 4 10.10.2010 18:23
JavaScript Глобальные переменные MixMe Javascript под браузер 1 12.07.2009 13:04