Область видимости переменной Javascript - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь сделать простую функцию с помощью js & jquery, но не могу заставить это работать.

Из того, что я понимаю, когда я объявляю переменную без var, она становится глобальной, но я могупередать переменную из обратного вызова jquery в мою основную функцию.

   function fetchEvents(start,end){
        ret = [];
        $j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){
            console.log(data); // works ok
            ret = data;
        });
        console.log(ret); // equals [] :'(
        return ret;
    }

Ответы [ 7 ]

2 голосов
/ 29 марта 2011

Ваша проблема в том, что $ .getJSON использует обратный вызов, поэтому при вызове функции fetchEvents возвращается до выполнения обратного вызова.

то, что вы хотите сделать, - это заполнить / сделать то, что вы хотите сделать.

как вы указали, console.log нормально работает в обратном вызове

2 голосов
/ 29 марта 2011

Из того, что я понимаю, когда я объявляю переменную с помощью var, она становится глобальной.

Все наоборот. Когда вы опускаете var, переменная становится глобальной. Всегда используйте var!

Из Руководства по стилю Google JavaScript :

Когда вы не можете указать var, переменная помещается в глобальный контекст, потенциально стучащий существующие ценности. Кроме того, если нет декларация, трудно сказать в чем область действия переменной жизни (например, она может быть в документе или окне так же, как легко как в местном объеме). Так всегда объявляйте с помощью var.

Что касается вашей проблемы с console.log(ret); // equals [] :'( ...

$j.getJSON() не является синхронным вызовом метода. Метод работает асинхронно, поэтому ваш код говорит:

ret = [];
console.log(ret);

Если вам нужно использовать данные, возвращаемые вашим getJSON () после его выполнения, вы можете вызвать метод в вашей функции обратного вызова:

$j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,
    function(data){      // this is your callback function
      console.log(data); // works ok
      doSomething(data); // process the returned JSON
    }
});
1 голос
/ 29 марта 2011

Похоже, что вы путаете 2 проблемы здесь.

Во-первых, var не создает переменную gloabl.Противоположность верна.Если пропустить var, переменная станет глобальной.

Второй метод обратного вызова getJSON не выполняется синхронно.Он будет выполнен после завершения http-запроса.Поэтому не ожидается, что ret будет установлено в значение сразу после вызова getJSON.

0 голосов
/ 29 марта 2011

Проблема в том, что вы пишете асинхронный код.

Когда вы вызываете getJSON, внутренняя функция не будет вызываться, пока getJSON не вернет что-то. Это означает, что код больше не выполняется сверху вниз, ваша программа продолжает выполнение, даже когда getJSON все еще получает данные.

Вы должны предоставить callback вместо return:

var fetchEvents = function (start, end, callback) {
  $j.getJSON("index.php?start="+start+"&end="+end, function (data) {
    callback(data);
  });
};

// Now you can use fetchEvents which will be asynchronous too
fetchEvents(0, 10, function (data) {
  console.log(data);
})

Вы можете упростить событие fetchEvents, передав callback непосредственно в getJSON.

var fetchEvents = function (start, end, callback) {
  $j.getJSON("index.php?start="+start+"&end="+end, callback);
};

PD: я упростил запрос на удобочитаемость.

0 голосов
/ 29 марта 2011

Это потому, что ret оценивается ДО того, как вы получите ответ от ajax. Попробуйте

function fetchEvents(start,end){
        $j.getJSON("index.php?page=agenda_google_ajax&action=list&start="+start+"&end="+end,function(data){
            console.log(data); // works ok
            var ret = data
            whatsRet (ret);
        });
        }

function whatsRet (ret) {
        console.log(ret); // equals data :)
}
0 голосов
/ 29 марта 2011

добавление к нему переменной не делает его глобальным, опущение делает его глобальным, он добавляется к объекту глобального окна.

0 голосов
/ 29 марта 2011

попробуйте добавить переменную к var ret = [];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...