Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   объявление переменной (https://javascript.ru/forum/misc/71435-obyavlenie-peremennojj.html)

mikello 18.11.2017 12:48

объявление переменной
 
Всем привет, может кто поможет понять следующий код:

Цитата:

function Send() {

$.post("ajax.php",
{
act: "send", // указываем скрипту, что мы отправляем новое сообщение и его нужно записать
name: $("#pac_name").val(), // имя пользователя
text: $("#pac_text").val() // сам текст сообщения
},
Load); // по завершению отправки вызываем функцию загрузки новых сообщений Load()

$("#pac_text").val(""); // очистим поле ввода сообщения
$("#pac_text").focus(); // и поставим на него фокус
document.write(last_message_id);
return false; // очень важно из Send() вернуть false. Если этого не сделать то произойдёт отправка нашей формы, те страница перезагрузится
}
var last_message_id = 0; // номер последнего сообщения, что получил пользователь
var load_in_process = false; // можем ли мы выполнять сейчас загрузку сообщений. Сначала стоит false, что значит - да, можем
Несмотря на то,что переменные last_message_id и load_in_process определены после функции. document.write(last_message_id) срабатывает и выводит значение 0.

Этот код эквивалентен следующему:
Цитата:

var last_message_id = 0; // номер последнего сообщения, что получил пользователь
var load_in_process = false; // можем ли мы выполнять сейчас загрузку сообщений. Сначала стоит false, что значит - да, можем

// Функция для отправки сообщения
function Send() {

$.post("ajax.php",
{
act: "send", // указываем скрипту, что мы отправляем новое сообщение и его нужно записать
name: $("#pac_name").val(), // имя пользователя
text: $("#pac_text").val() // сам текст сообщения
},
Load); // по завершению отправки вызываем функцию загрузки новых сообщений Load()

$("#pac_text").val(""); // очистим поле ввода сообщения
$("#pac_text").focus(); // и поставим на него фокус
document.write(last_message_id);
return false; // очень важно из Send() вернуть false. Если этого не сделать то произойдёт отправка нашей формы, те страница перезагрузится
}

Почему так происходит ? Как document.write() может выводить значение переменной last_message_id, если определена она уже после функции?

Dilettante_Pro 18.11.2017 15:08

mikello,
JS сначала считывается и интерпретируется, фиксируются все определения, и уже потом исполняется. Поэтому неважно, где стоит определение переменной по порядку кода скрипта. И еще, мне кажется, вам стоит почитать про асинхронность запросов.

mikello 18.11.2017 16:26

Следующий пример выведет значение undefined (чем этот пример отличается от предыдущего? ничем,однако здесь undefined):

function a()
{
document.write(f);
}
a();
var f=0;

В предыдущем примере переменная определялась ПОСЛЕ функции, так почему она была доступна уже внутри самой функции?

Цитата:

Поэтому неважно, где стоит определение переменной по порядку кода скрипта
Вы ошибаетесь, откройте любой учебник по JS.

Dilettante_Pro 18.11.2017 19:06

mikello,
Признаю, ошибся - издержки поограммирования на нескольких языках одновременно.

В вашем первом примере переменная определена раньше, чем используется при вызове функции - типа поменяйте местами две последние строки в вашем последнем примере

mikello 18.11.2017 20:59

Я ошибся, пример на самом деле такой :

Цитата:

$(document).ready(function () {
document.write(f);
});
var f=0;
Переменная f определена после вызова функции, однако функция выводит значение 0.

Dilettante_Pro 19.11.2017 11:37

Не совсем так: переменная определяется раньше, чем выполняется функция по событию 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>

mikello 19.11.2017 13:56

Теперь понятно) Спасибо.

mikello 19.11.2017 14:31

А как сделать так, чтобы сначала мы ожидали ответа от $(document).ready(function(){}), а уже потом присваивали значение 0 переменной f?

Dilettante_Pro 19.11.2017 16:17

mikello,
Присвоить значение переменной внутри document ready function

mikello 19.11.2017 17:25

Цитата:

$(document).ready(function()
{
document.write(f);
var f=0;
})
var f=1;
document.write(f)
Выводит undefined, но далее, что самое интересное не выводит 1. Каким образом добавление строки var f=0; внутри document ready function повлияло на порядок выполнения команд ? Что изменилось ?

Цитата:

$(document).ready(function()
{
alert(f);
var f=0;
})
var f=1;
alert(f);
В этом примере сначала выводится 1 , а потом уже undefined. То есть все наоборот, чем в примере выше.


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