18.11.2017, 12:48
|
Аспирант
|
|
Регистрация: 18.11.2017
Сообщений: 68
|
|
объявление переменной
Всем привет, может кто поможет понять следующий код:
Цитата:
|
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, если определена она уже после функции?
Последний раз редактировалось mikello, 18.11.2017 в 12:55.
|
|
18.11.2017, 15:08
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
mikello,
JS сначала считывается и интерпретируется, фиксируются все определения, и уже потом исполняется. Поэтому неважно, где стоит определение переменной по порядку кода скрипта. И еще, мне кажется, вам стоит почитать про асинхронность запросов.
|
|
18.11.2017, 16:26
|
Аспирант
|
|
Регистрация: 18.11.2017
Сообщений: 68
|
|
Следующий пример выведет значение undefined (чем этот пример отличается от предыдущего? ничем,однако здесь undefined):
function a()
{
document.write(f);
}
a();
var f=0;
В предыдущем примере переменная определялась ПОСЛЕ функции, так почему она была доступна уже внутри самой функции?
Цитата:
|
Поэтому неважно, где стоит определение переменной по порядку кода скрипта
|
Вы ошибаетесь, откройте любой учебник по JS.
Последний раз редактировалось mikello, 18.11.2017 в 16:42.
|
|
18.11.2017, 19:06
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
mikello,
Признаю, ошибся - издержки поограммирования на нескольких языках одновременно.
В вашем первом примере переменная определена раньше, чем используется при вызове функции - типа поменяйте местами две последние строки в вашем последнем примере
|
|
18.11.2017, 20:59
|
Аспирант
|
|
Регистрация: 18.11.2017
Сообщений: 68
|
|
Я ошибся, пример на самом деле такой :
Цитата:
|
$(document).ready(function () {
document.write(f);
});
var f=0;
|
Переменная f определена после вызова функции, однако функция выводит значение 0.
|
|
19.11.2017, 11:37
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
Не совсем так: переменная определяется раньше, чем выполняется функция по событию 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>
Последний раз редактировалось Dilettante_Pro, 19.11.2017 в 12:10.
|
|
19.11.2017, 13:56
|
Аспирант
|
|
Регистрация: 18.11.2017
Сообщений: 68
|
|
Теперь понятно) Спасибо.
|
|
19.11.2017, 14:31
|
Аспирант
|
|
Регистрация: 18.11.2017
Сообщений: 68
|
|
А как сделать так, чтобы сначала мы ожидали ответа от $(document).ready(function(){}), а уже потом присваивали значение 0 переменной f?
|
|
19.11.2017, 16:17
|
Профессор
|
|
Регистрация: 27.11.2015
Сообщений: 2,899
|
|
mikello,
Присвоить значение переменной внутри document ready function
|
|
19.11.2017, 17:25
|
Аспирант
|
|
Регистрация: 18.11.2017
Сообщений: 68
|
|
Цитата:
|
$(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. То есть все наоборот, чем в примере выше.
Последний раз редактировалось mikello, 19.11.2017 в 17:42.
|
|
|
|