Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: Общие вопросы > Локальные и глобальные переменные


Автор: GIK 12.9.2005, 11:44
Привет всем. У меня как обычно возник простенький вопрос.
Но для начала мне нужно чтобы скрипт приведенный ниже работал smile . Помогите плз.,

Код

<html>
<head>
  <script type="text/javascript">
  <!--
var numberA;
function num ()
{ var numberA=11;
  document.writeln("После вызова функции "num",  значение A=" + numberA + "<br/>");

{
// --> 
</script>
</head>
<body>
   <script type="text/javascript">
   <!--
numberA=12;
document.writeln(Начальное значение numberA=" + numberA + "<br/>");
num();
   // --> 
   </script>
</body>
</html>

А вопрос заключается в следующем: вот если я объявляю глобальную переменную var numberA в
части <head> и присваиваю ей какое нибуть значението, то что будет, если я объявлю другое значение этой же переменной в части <body>, т.е. какое значение "вылезет" в документ конструкцией document.writeln("глобальная переменная numberA=" + numberA);
Извините за то что спрашиваю если сам могу проверить, но блин не могу, потомучто мой скрипт не работает smile .

Автор: Burrr 12.9.2005, 12:31
Ты запутался в расстановке кавычек и скобок.
Вот так всё работает и можно разобраться с переменной:
Код

<html>
<head>
<script type="text/javascript">
<!--
var numberA;
function num()
{
  var numberA=11;
  document.writeln("После вызова функции \"num\",  значение A=" + numberA + "<br/>");
}
--> 
</script>
</head>
<body>
<script type="text/javascript">
<!--
num();
numberA=12;
document.writeln("Начальное значение numberA=" + numberA + "<br/>");
num();
--> 
</script>
</body>
</html>

Автор: GIK 12.9.2005, 13:30
Спасибо что помог со скриптом.

Да приоритет отдается части <body>.
А теперь сделаем следующее:
Код

<html>
<head>
<script type="text/javascript">
<!--
var numberA=14;
documen.writeln("самое первое значение получаемое переменной numberA=" + numberA +"<br/>");
function num()
{
  var numberA=11;
  document.writeln("После вызова функции \"num\",  значение A=" + numberA + "<br/>");
}
--> 
</script>
</head>
<body>
<script type="text/javascript">
<!--
numberA=12;
document.writeln("Начальное значение numberA=" + numberA + "<br/>");
num();
--> 
</script>
</body>
</html>

Теперь, по сути, должно быть начальным число=14, ведь когда загружается браузер, все что находится в части <head> загружается первым, значит и вывод
documen.writeln("самое первое значение получаемое переменной numberA=" + numberA +"<br/>"); должен быть первым.
smile smile smile

Автор: Aliance 12.9.2005, 13:40
Модератор: пользуемся подсветкой корректно! Это не код C++, это код JS!
Правила форума: http://forum.vingrad.ru/index.php?s=&act=SR&f=27

Автор: Aliance 12.9.2005, 14:25
Цитата(GIK @ 12.9.2005, 12:44)
А вопрос заключается в следующем: вот если я объявляю глобальную переменную var numberA в
части <head> и присваиваю ей какое нибуть значението, то что будет, если я объявлю другое значение этой же переменной в части <body>, т.е. какое значение "вылезет" в документ конструкцией document.writeln("глобальная переменная numberA=" + numberA);

Область видимости переменной (глобальной) ограничивается (в клиентском JS) окном, содержащим документ. А далее происходит такой алгоритм:

  • ты объявляешь переменную в head`е
  • ты устанавливаешь ее новое значение в body


Цитата(GIK @ 12.9.2005, 14:30)
Да приоритет отдается части <body>.

Нет... фактически происходит так, но это не так, на самом деле.
Добавлено @ 14:27
Цитата(GIK @ 12.9.2005, 14:30)
Теперь, по сути, должно быть начальным число=14, ведь когда загружается браузер, все что находится в части <head> загружается первым, значит и вывод

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

Автор: GIK 12.9.2005, 14:39
Цитата
Ты плохо представляешь себе как выполняются сценарии JS, это расказывать долго, поэтому поверь наслово

И на этом спасибо smile

Автор: Sardar 12.9.2005, 15:19
Цитата(GIK @ 12.9.2005, 12:30)
Теперь, по сути, должно быть начальным число=14, ведь когда загружается браузер, все что находится в части <head> загружается первым, значит и вывод
documen.writeln("самое первое значение получаемое переменной numberA=" + numberA +"<br/>"); должен быть первым.

Для начала нужно прочесть спецификацию http://www.w3.org/TR/html401/ Без этого ещё какую чушь напорем smile
Кратко: секция head только для метаданных страницы, сам же документ отрисовываеться от body.

Существует понятие "поток документа", это поток тегов и текста. document.write пишет в поток документа, т.е. тег script удаляеться, а на его место вставляеться текстом всё что document.write выдал. Понятие "поток документа" не существует в XHTML, отсюда станет ясно почему там "нельзя" пользоваться document.write.


P.S. не тупи с ошибками, всегда смотри как подсвечиваеться код в редакторе, сразу увидишь какие скобки не закрыл. Также полезно смотреть в консоль браузера smile

Автор: GIK 12.9.2005, 15:37
Все понятно кроме
Цитата
т.е. тег script удаляеться, а на его место вставляеться текстом всё что document.write выдал.

какой script удаляется?


Цитата
P.S. не тупи с ошибками, всегда смотри как подсвечиваеться код в редакторе, сразу увидишь какие скобки не закрыл. Также полезно смотреть в консоль браузера

OK. Буду внимательным.

Автор: Sardar 12.9.2005, 16:05
Цитата(GIK @ 12.9.2005, 14:37)
какой script удаляется?

Тот который сейчас исполняеться. Другими словами если отойти от W3C DOM и структурного XML представления документа, перейти на родную для HTML'а кашу из маркировочных тегов(собсна философия SGML), то врубимся что теги это поток инфы. Отсюда ясно почему очень много парных тегов в HTML не требуют закрывающего тега.

В таком потоке встречаеться <script>, его содержимое полностю удаляеться из потока(не рисуеться), а всё что скрипт написал вставляеться на его место.

Повторяю: эта логика уже устарела в современном мире smile Сейчас принято верстать в XHTML, где документ это чёткое дерево и нет никаких <b>test <i>test</b> test</i>.

Автор: GIK 12.9.2005, 16:27
Цитата
то врубимся что теги это поток инфы

Цитата
В таком потоке встречаеться <script>, его содержимое полностю удаляеться из потока(не рисуеться), а всё что скрипт написал вставляеться на его место
.

Вот теперь все ясно. Биг тебе спасиб Sarbar


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)