Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.11.2017, 12:48
Аспирант
Отправить личное сообщение для mikello Посмотреть профиль Найти все сообщения от mikello
 
Регистрация: 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.
Ответить с цитированием
  #2 (permalink)  
Старый 18.11.2017, 15:08
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

mikello,
JS сначала считывается и интерпретируется, фиксируются все определения, и уже потом исполняется. Поэтому неважно, где стоит определение переменной по порядку кода скрипта. И еще, мне кажется, вам стоит почитать про асинхронность запросов.
Ответить с цитированием
  #3 (permalink)  
Старый 18.11.2017, 16:26
Аспирант
Отправить личное сообщение для mikello Посмотреть профиль Найти все сообщения от mikello
 
Регистрация: 18.11.2017
Сообщений: 68

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

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

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

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

Последний раз редактировалось mikello, 18.11.2017 в 16:42.
Ответить с цитированием
  #4 (permalink)  
Старый 18.11.2017, 19:06
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

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

В вашем первом примере переменная определена раньше, чем используется при вызове функции - типа поменяйте местами две последние строки в вашем последнем примере
Ответить с цитированием
  #5 (permalink)  
Старый 18.11.2017, 20:59
Аспирант
Отправить личное сообщение для mikello Посмотреть профиль Найти все сообщения от mikello
 
Регистрация: 18.11.2017
Сообщений: 68

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

Цитата:
$(document).ready(function () {
document.write(f);
});
var f=0;
Переменная f определена после вызова функции, однако функция выводит значение 0.
Ответить с цитированием
  #6 (permalink)  
Старый 19.11.2017, 11:37
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 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.
Ответить с цитированием
  #7 (permalink)  
Старый 19.11.2017, 13:56
Аспирант
Отправить личное сообщение для mikello Посмотреть профиль Найти все сообщения от mikello
 
Регистрация: 18.11.2017
Сообщений: 68

Теперь понятно) Спасибо.
Ответить с цитированием
  #8 (permalink)  
Старый 19.11.2017, 14:31
Аспирант
Отправить личное сообщение для mikello Посмотреть профиль Найти все сообщения от mikello
 
Регистрация: 18.11.2017
Сообщений: 68

А как сделать так, чтобы сначала мы ожидали ответа от $(document).ready(function(){}), а уже потом присваивали значение 0 переменной f?
Ответить с цитированием
  #9 (permalink)  
Старый 19.11.2017, 16:17
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

mikello,
Присвоить значение переменной внутри document ready function
Ответить с цитированием
  #10 (permalink)  
Старый 19.11.2017, 17:25
Аспирант
Отправить личное сообщение для mikello Посмотреть профиль Найти все сообщения от mikello
 
Регистрация: 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.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменение значения переменной в режиме реального времени The_FactioN jQuery 3 09.03.2016 12:20
посылка переменной kent0026 jQuery 5 04.01.2014 17:34
Как значение переменной вставить в имя переменной? jsgogo Общие вопросы Javascript 3 02.06.2013 12:11
правильное объявление переменной Karpo Общие вопросы Javascript 5 29.09.2010 15:35
Видимость еременных. Объявление и присваивание. DonLino jQuery 9 12.08.2010 12:44