объявление переменной
Всем привет, может кто поможет понять следующий код:
Цитата:
Этот код эквивалентен следующему: Цитата:
Почему так происходит ? Как 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, время: 11:02. |