Инициализцаия переменных во вложенном джаваскрипте...

12
Appassionato
На сайте с 22.06.2010
Offline
328
651

Давно не кодил на js - все позабывал уже нафиг. Собственно, вопрос....

Есть скрипт типа:


var var1 = '0';
document.write('<sc'+'ript type="text/javasc'+'ript" src="/external.js"></sc'+'ript>');
document.write(var1);

external.js содержит код:

var1="123";

document.write('567');

Браузеры в итоге отдают 5670. Т.е. инструкции выполняются вроде бы последовательно, но это не касается инициализации переменных.

Что я пропустил? И как правильно?

Хостинг Работает, как Часы ( http://tinyurl.com/nze85xw ). Проверено за 11+ лет.
minor
На сайте с 04.10.2010
Offline
70
#1

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

PHP experience 2 year, comprehend seo
ДП
На сайте с 23.11.2009
Offline
203
#2

Думается мне тут дело в scope переменных, а не в порядке выполнения.

Appassionato
На сайте с 22.06.2010
Offline
328
#3

На первый взгляд должно выполнится в таком порядке:

var var1 = '0';

var1="123";
document.write('567');
document.write(var1);

=567123

а на деле, получается аналог вот такого:

var var1 = '0';

document.write('567');
document.write(var1);
var1="123";

=5670

ДП
На сайте с 23.11.2009
Offline
203
#4

Переменные, объявленные без var становятся глобальными, т.е. принадлежат объекту window. Переменные, объявленные с var - локальные.

Appassionato
На сайте с 22.06.2010
Offline
328
#5
Дикий пионер:
Думается мне тут дело в scope переменных, а не в порядке выполнения.

Если вставить алерт перед вторым document.write, то получается то, что задумано...

Т.е. значение переменной присваивается асинхронно.

---------- Добавлено в 20:56 ---------- Предыдущее сообщение было в 20:54 ----------

Дикий пионер:
Переменные, объявленные без var становятся глобальными, т.е. принадлежат объекту window. Переменные, объявленные с var - локальные.

замена var var1 на window.var1 эффекта не дала.

ДП
На сайте с 23.11.2009
Offline
203
#6

Хотя да, любопытно.

А вы с какой целью этим вопросом интересуетесь? Обычно все действия начинают выполнять после построения dom-дерева документа, к тому моменту переменные должны быть инициализированны уже.

Appassionato
На сайте с 22.06.2010
Offline
328
#7

Мне нужно было подтянуть значение переменной, которое выгребалось парсером на пхп и отдавалось в виде джаваскрипта. Чтобы минимально вмешиваться в существующий говнокод с обоих сторон, попробовал сделать фичу, которая описана выше. А в итоге - фигвам.

Заморачиваться не стал - решил асинхронно через DOM. Но раньше почему-то был уверен, что скрипты исполняются строго в порядке подключения, в т.ч. инициализация переменных.

PB
На сайте с 29.11.2007
Offline
40
#8

Интересный вопрос.

<script type="text/javascript">

a = 'test1';

document.write(a);

</script>

<br>

<script type="text/javascript">

a = 'test2';

document.write(a);

</script>

Выведет: test1 test2

От <script> до </script> ???

И подключаемый скрипт не должен обрабатываться позже?

Документ разворачивается:

<script type="text/javascript">

var var1 = '0';

document.write('<sc'+'ript type="text/javasc'+'ript" src="external.js"></sc'+'ript>');

document.write(var1);

</script>

<script src="external.js" type="text/javascript">

var1='123';

document.write(567);

</script>

Appassionato
На сайте с 22.06.2010
Offline
328
#9
PLSB:

<script type="text/javascript">
var var1 = '0';
document.write('<sc'+'ript type="text/javasc'+'ript" src="external.js"></sc'+'ript>');
document.write(var1);
</script>
<script src="external.js" type="text/javascript">
var1='123';
document.write(567);
</script>

Ну вот по факту, если бы оно так разворачивалось, то было бы 0567, а на деле 5670.

Т.е. document.write выполняется "в потоке кода", а присваивание вне его.

[Удален]
#10

Выводятся последовательно две строки. Одна - "567", дрругая - "0". Пробелов нет, переносов строки нет.

Всё правильно!

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий