Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > JavaScript: для новичков > видимость переменной из $.ajax


Автор: begin 15.7.2012, 01:17
Перед отправкой формы посылаю аяксом запрос на сервер, чтобы проверить данные. Php-cкрипт должен отдать либо error либо success. А js в зависимости от полученного ответа решит, что делать дальше:

Код

var ajax_url = 'check.php';
var error_data = '';
$.ajax({
    url: ajax_url,
    success: function(data){
        error_data = data;
        alert (data);
    }
});
var error_check = 1;
if (error_data == 'success') error_check = 0;


С сервера приходит ответ и alert выводит его значение, но проблема в том, что переменной error_data ничего не присваивается - похоже внутри той функции она просто не видна.
Пробовал объявлять эту переменную и так:
Код

var error_data = '';

и так:
Код

error_data = '';

не помогло. Посоветуйте, как и где правильно объявить эту переменную, чтобы все заработало  smile 

Автор: Amphiluke 15.7.2012, 10:48
Цитата(begin @  15.7.2012,  05:17 Найти цитируемый пост)
Код

if (error_data == 'success') error_check = 0;

Вы пытаетесь считать значение переменной error_data еще до того как придет ответ от сервера (т.е. до того как будет выполнена callback-функция success) — в силу асинхронности запроса. Так что либо делайте запрос синхронным, либо переносите анализ ответа сервера в ф-цию success.

Автор: begin 15.7.2012, 16:14
Понял, включу синхронность в аяксе. А подскажите - переменную я объявляю правильно? или все-же нужно иначе?

именно так нужно?

Код

var ajax_url = 'check.php';
var error_data = '';
$.ajax({
    url: ajax_url,
    success: function(data){
        error_data = data;
        alert (data);
    }
});
var error_check = 1;
if (error_data == 'success') error_check = 0;

Автор: Amphiluke 15.7.2012, 17:25
Цитата(begin @  15.7.2012,  20:14 Найти цитируемый пост)
именно так нужно?

А что вас смущает? Стандартное объявление переменной. smile

Автор: begin 15.7.2012, 19:00
Спросил потому, что в сети обнаружил противоречивые рекомендации, и мне, как начинающему, трудно в них соориентироваться.
Итак, пишут, что:

1. объявляя глобальную переменную, нужно писать не:
Код

var error_data = '';

а:
Код

error_data = '';



2. обращаться к такой глобальной переменной внутри функции нужно не так:
Код

error_data = data;

а так:
Код

window.error_data = data;

Автор: Amphiluke 15.7.2012, 19:35
Цитата(begin @  15.7.2012,  23:00 Найти цитируемый пост)

Итак, пишут, что:

1. объявляя глобальную переменную, нужно писать не
Код
var error_data = '';

а:
Код
error_data = '';



Это заблуждение. Переменные объявляются только при помощи ключевого слова var. Если вы не используете var, то это не объявление переменной, а создание свойства глобального объекта. Отличие в том, что истинные переменные обладают внутренним свойством, запрещающим их удаление оператором delete, а также истинные переменные участвуют в таком процессе как «поднятие» (hoisting). Конкретнее, переменные, созданные с помощью var, становятся свойством объекта переменных.
Для «переменных», объявленных без var, эти утверждения уже не справедливы.

Цитата(begin @  15.7.2012,  23:00 Найти цитируемый пост)
2. обращаться к такой глобальной переменной внутри функции нужно не так

Код

error_data = data;


а так

Код

window.error_data = data;



Это опять же из-за непонимания отличий между глобальной переменной и свойством глобального объекта (на который ссылается window). Вы можете обращаться к глобальным переменным (истинным переменным, объявленным при помощи var) через window, благодаря тому, что глобальный объект сам для себя является объектом переменных.

Автор: begin 15.7.2012, 21:07
Благодарю за такой подробный ответ  smile 

Цитата

Вы можете обращаться к глобальным переменным (истинным переменным, объявленным при помощи var) через window

правильно ли я понял: могу в качестве второго способа, но и напрямую внутри функции я тоже могу обратиться к этой переменной, да?


Код

var some_var = 'проверка!';
$.ajax({
    url: ajax_url,
    success: function(data){
        alert (some_var);//выдаст "проверка!"
    }
});


Автор: Aliance 16.7.2012, 10:35
begin, если говорить кратко и не вдаваясь в ньюансы, то объявление переменных без ключевого слова var в книжках обычно подразумевает создание переменной с глобальной областью видимости внутри функции со своей областью видимости. Поясню на примере:
Код

var myvariable;
function myfunction() {
   myvariable = 'ololo';
}
myfunction();
alert(myvariable); // ololo

идентичен такому коду:
Код

function myfunction() {
   var myvariable = 'ololo';
}
myfunction();
alert(myvariable); // ololo

Но зато сл. код выдаст ошибку

Код

function myfunction() {
   var myvariable = 'ololo';
}
myfunction();
alert(myvariable); // undefined variable

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)