объявление переменной
Всем привет, может кто поможет понять следующий код:
Цитата:
Этот код эквивалентен следующему: Цитата:
Почему так происходит ? Как document.write() может выводить значение переменной last_message_id, если определена она уже после функции? |
mikello,
JS сначала считывается и интерпретируется, фиксируются все определения, и уже потом исполняется. Поэтому неважно, где стоит определение переменной по порядку кода скрипта. И еще, мне кажется, вам стоит почитать про асинхронность запросов. |
Следующий пример выведет значение undefined (чем этот пример отличается от предыдущего? ничем,однако здесь undefined):
function a() { document.write(f); } a(); var f=0; В предыдущем примере переменная определялась ПОСЛЕ функции, так почему она была доступна уже внутри самой функции? Цитата:
|
mikello,
Признаю, ошибся - издержки поограммирования на нескольких языках одновременно. В вашем первом примере переменная определена раньше, чем используется при вызове функции - типа поменяйте местами две последние строки в вашем последнем примере |
Я ошибся, пример на самом деле такой :
Цитата:
|
Не совсем так: переменная определяется раньше, чем выполняется функция по событию ready
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script>$(document).ready(function () { console.log('Внутри'); console.log(f); }); console.log('Снаружи'); var f=0; </script> |
Теперь понятно) Спасибо.
|
А как сделать так, чтобы сначала мы ожидали ответа от $(document).ready(function(){}), а уже потом присваивали значение 0 переменной f?
|
mikello,
Присвоить значение переменной внутри document ready function |
Цитата:
Цитата:
|
mikello,
Для отслеживания корректной аоследовательности используйте не document.write и alert, а console.log. Тем более что второй document.write затирает предыдущий |
Он не затирает предыдущий, в том то и дело. Он вообще не работает.
|
mikello,
Замените на console.log и посмотрите |
Он никогда и не затирал. Вот пример, выводит ab.
Цитата:
|
До ready пишет в document, после - записывает все заново, затирая то,что было раньше
|
Цитата:
|
Ошибся. Все правильно. Но почему здесь при втором вызове alert(f) выводится undefined, ведь переменная var f=1; уже было определено.
Цитата:
|
Сравните первый и второй примеры и посмотрите третий
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script> $(document).ready(function () { document.write('b'); }); document.write('a'); </script> <script> document.write('a'); document.write('b'); </script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script>$(document).ready(function() { console.log(f) var f=0; }) var f=1; console.log(f) </script> |
Теперь понял. А как сделать так , чтобы сначала выполнялся код в function(){}, а потом уже за ее пределами ?
|
Так не получится.
Чтобы выполнялся позже, включите в конец ready function |
ready function и так выполняется в последнюю очередь.
|
Цитата:
я представляю себе работу интерпретатора на данном ниже примере так: 1) f=1; 2) вывести 1; 3) переменная f на момент выполнения ready - undefined 4)f=0 Цитата:
|
mikello,
Неправильно. Уберите var f=0; в ready или поставьте в начало - и undefined исчезнет. Дело в том, что в ready вы заново переопределяете переменную, но после использования. <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script>$(document).ready(function() { console.log(f) }) var f=1; console.log(f) </script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script>$(document).ready(function() { var f=0; console.log(f) }) var f=1; console.log(f) </script> <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.0/jquery.min.js"></script> <script>$(document).ready(function() { f=0; console.log(f) }) var f=1; console.log(f) </script> |
Да, но переопределяю я ее уже после вызова document.write(f); , вот здесь непонятно почему с переменной что-то происходит и каким образом.
Интерпретатор ведь считывает все команды последовательно, так почему f=1 не имеет значения на момент document.write(f) в ready? Почему к началу действия ready переменная имеет undefined? Она же была определена как 1. Вот что непонятно( |
Переменные имеют область видимости.
Сначала оба объявляется как глобальная переменная, внутри ready function переопределяется - глобальная в результате не видна. но значение локальная получает позже использования. |
А почему тогда в данном примере область видимости не имеет значения и переменная внутри ready равна 1?
Цитата:
|
mikello,
Здесь f глобальная - объявлена вне function и не переопределяется внутри, поэтому видна ВЕЗДЕ. |
Цитата:
Цитата:
Если конкретнее - что происходит с глобальной переменной f в самом начале ready (до вызова alert())? Цитата:
|
Почитайте про глобальные обьекты в учебнике на этом форуме
|
Как я понимаю то, что происходит с переменной f на всем участке кода:
1) f=1 2) f-undefined 3)f=0 Я не совсем понимаю при чем здесь область видимости переменной, если var f=0 идет после alert. Интерпретатор обрабатывает команды последовательно. Вот вы говорите: Цитата:
Цитата:
|
у моего знакомого вообще undefined выводит:
|
Цитата:
|
а как должен выглядеть этот код с глобальной переменной?
|
Цитата:
|
mikello,
сейчас ваш код выглядит на самом деле так window.onload=function(){ $(document).ready(function() { alert(f); }); var f = 1 } |
window.load вызывается, когда все элементы страницы загружены. Что это меняет по сути ? Почему переменная var f=1 перестала быть глобальной?
|
у меня ваш код выводит 1
|
Цитата:
|
но у меня выводится 1
|
mikello,
:-? <!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script> <script> window.onload=function(){ $(document).ready(function() { alert(f);// undefined }); var f = 1; } </script> </head> <body> </body> </html> |
Часовой пояс GMT +3, время: 03:31. |