Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Странное поведение переменной при подключении скрипта. (https://javascript.ru/forum/events/20616-strannoe-povedenie-peremennojj-pri-podklyuchenii-skripta.html)

Kotakota 11.08.2011 13:34

Странное поведение переменной при подключении скрипта.
 
Привет.
Есть файл скрипта:
test.js
var cool = {id:5};

Теперь самое интересное!
Подключаем этот файл из *.html методом раз:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> New Document </title>
<script type="text/javascript" src="test.js"></script>
<script>alert(cool.id);</script>
</head>
<body>
<button onClick="javascript:alert(cool.id);">Press here for get you id now!</button>
</body>
</html>

Тут все понятно. Сначала alert'ом выводится число 5, а если нажимаем на кнопку "Press here for get you id now!", то число 5 выводится еще раз.
Подключаем этот файл из *.html методом два:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title> New Document </title>
</head>
<body>
<button onClick="javascript:alert(cool.id);">Press here for get you id now!</button>
<script>
(function() {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.async =  true;
    script.src = 'test.js';
    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(script);
})();
</script>
<script>alert(cool.id);</script>
</body>
</html>

При попытке вывести число 5, простым alert'ом появляется ошибка:
cool is not defined
а если нажать на кнопку, то все в порядке и число 5 выводится!
Почему так происходит?
Хочу обратить внимание, что во втором варианте подключения, я даже строку
<script>alert(cool.id);</script>

опустил ниже динамического подключения самого скрипта.
Чтобы на верняка!

devote 11.08.2011 13:41

Ну а что ты хотел все так быстро, понятно дело что нужно время на то что бы скрипт загрузился, вот пока он грузится этот alert срабатывает быстрее чем загрузился скрипт

Kotakota 11.08.2011 13:43

Цитата:

Сообщение от devote (Сообщение 119771)
Ну а что ты хотел все так быстро, понятно дело что нужно время на то что бы скрипт загрузился, вот пока он грузится этот alert срабатывает быстрее чем загрузился скрипт

Едрит Мадрид!
Спасибо!

Kotakota 11.08.2011 14:01

Ну и вопрос в тему...
А как при втором варианте проверить, что скрипт загрузился?
Кроме извращений с callback и onreadystatechange?
Выполнить его в setTimeout()?

devote 11.08.2011 14:16

Цитата:

Сообщение от Kotakota
Кроме извращений с callback и onreadystatechange?
Выполнить его в setTimeout()?

типо того

devote 11.08.2011 15:07

есть еще такой вариант http://javascript.ru/forum/events/20...tml#post119064

Kotakota 12.08.2011 05:52

Цитата:

Сообщение от devote (Сообщение 119812)
есть еще такой вариант http://javascript.ru/forum/events/20...tml#post119064

Я подумаю над этим.
Спасибо!
Но пока склоняюсь подключить скрипт в конец тега <BODY> ;)


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