Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > JavaScript, Ajax
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.08.2016, 14:07   #1
Dovlet
Пользователь
 
Регистрация: 19.08.2016
Сообщений: 14
По умолчанию Не могу понять, почему не видит переменную функция

Добрый день. Вопрос детский, но я только в начале пути.

Если переменную mytime создать внутри функции, сделать локальной, то функция sec() её видит. Но, если вынести, как в приведённом мною примере кода, функция sec() не видит её. Объясните пожалуйста принцип.

Код:
	<script type="text/javascript">
			var myTime = document.getElementById("mySecund");
			var id = setInterval("sec()", 1000);
			
			var counter = 0;
			function sec(){
				counter++;
				myTime.innerHTML = "Секунд прошло - " + counter;
				if(counter == 10)clearInterval(id);
				
			}
	</script>
Dovlet вне форума Ответить с цитированием
Старый 19.08.2016, 14:14   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

потому что ваш скрипт лежит раньше чем элемент
come-on вне форума Ответить с цитированием
Старый 19.08.2016, 14:20   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Вы, похоже, просто скрипт не правильно размещаете.
всё работает.

убедитесь в этом сами:
Код HTML:
<html>
<head>
    <meta charset="utf-8">
</head>
<body>
Time: <div id="mySecund">unknown</div>


<script type="text/javascript">
       var myTime = document.getElementById("mySecund");
       var id = setInterval("sec()", 1000);
       
       var counter = 0;
       function sec(){
       	counter++;
       	myTime.innerHTML = "Секунд прошло - " + counter;
       	if(counter == 10)clearInterval(id);
       	
       }
</script>

</body>
</html>
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.08.2016, 14:24   #4
Dovlet
Пользователь
 
Регистрация: 19.08.2016
Сообщений: 14
По умолчанию

Да. Скрипт у меня в head. Ок. Обясните тогда, пожалуйста, почему так происходит?

Т.е. если у меня скрипт лежит в head. Какая разница, переменная внтури функции или вне её объявляется и в неё передаются данные.
Dovlet вне форума Ответить с цитированием
Старый 19.08.2016, 14:38   #5
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

потому что так работает жизненный цикл страницы и порядок выполнения скриптов
come-on вне форума Ответить с цитированием
Старый 19.08.2016, 15:06   #6
Naive
Раздолбайских Дел
Старожил
 
Аватар для Naive
 
Регистрация: 22.05.2009
Сообщений: 3,828
По умолчанию

парсер страницы увидел скрипт — парсер скрипт запустил, но до твоего элемента он еще не дошел и не создал
Alar, верни репу!
Naive вне форума Ответить с цитированием
Старый 19.08.2016, 15:06   #7
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 823
По умолчанию

Всё же лучше скрипты располагать в head. Для корректной работы надо поставить слушатель на событие окончания постройки DOM, после чего к последнему можно будет обращаться:
Код:
document.addEventListener('DOMContentLoaded', function() {
  var myTime = document.getElementById("mySecund");
  var id = setInterval(sec, 1000);

  var counter = 0;

  function sec() {
    counter++;
    myTime.innerHTML = "Секунд прошло - " + counter;
    if (counter == 10) clearInterval(id);

  }
});
^-.-^ My GitHub
Fenex вне форума Ответить с цитированием
Старый 19.08.2016, 15:16   #8
Dovlet
Пользователь
 
Регистрация: 19.08.2016
Сообщений: 14
По умолчанию

мммм...тогда какая разница. Я просто не понимаю сам процесс. Я понимаю, что скрипт идёт раньше...
Я просто не понимаю, в чём разница, переменная создана за функцией или внутри её. В одном и том же случае скрипт располагается одинаково. Но если переменная вне функции, она её не видит, а если внутри - тогда видит
Dovlet вне форума Ответить с цитированием
Старый 19.08.2016, 15:19   #9
Fenex
Форумчанин
 
Аватар для Fenex
 
Регистрация: 15.02.2012
Сообщений: 823
По умолчанию

Потому что функция `sec` запускается через секунду - к этому времени скорее всего браузер уже успеет построить DOM (но гарантировать это нельзя).
^-.-^ My GitHub

Последний раз редактировалось Fenex; 19.08.2016 в 15:23.
Fenex вне форума Ответить с цитированием
Старый 20.08.2016, 04:41   #10
predefined
Форумчанин
 
Регистрация: 01.08.2016
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Dovlet Посмотреть сообщение
Но если переменная вне функции, она её не видит, а если внутри - тогда видит
Яваскрипт видит вашу переменную. Он просто не может выполнить document.getElementById("mySecund") , поскольку к моменту выполнения скрипта этот элемент ещё не существует в DOM (браузер его ещё не нарисовал).

Вызов скрипта/функции должен идти по HTML-коду ниже вашего <div id='mySecund'></div>, или запускаться по событию окончания загрузки страницы (формирования DOM)

Последний раз редактировалось predefined; 20.08.2016 в 04:45.
predefined вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу понять, почему ругается на это :( The Real Kos Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 19.09.2012 10:07
Не могу понять почему не дорисовывает.. victor5133 Общие вопросы C/C++ 0 24.02.2012 12:55
Не могу понять почему не работает функция SeRhy JavaScript, Ajax 0 09.02.2012 17:41
Не могу понять в почему ошибка Donim Паскаль, Turbo Pascal, PascalABC.NET 5 08.06.2011 23:07
Почему не работает...хм....понять не могу! Артур Иваныч Microsoft Office Excel 9 01.12.2009 17:58