Переменная Javascript не объявляется в области действия функции - PullRequest
1 голос
/ 11 июля 2011

Недавно я работал над некоторыми простыми функциями AJAX, используя MooTools. Моя проблема заключается в следующем коде:

function changePage(id, url) {
    var c = false,
        r = null;

    for (i = 0; i < history.length; i++) {
        if(history[i]['id'] === id) {
            console.log('cached');
            r = history[i].response;
            c = true;
        }
    }
    if(!c) {
        makeRequest(url, function(response) {
            r = response;
            history.push({id: id, response: response});
        });
    }

    changeBackground('_background', {color: r.bgColor, image: r.bgImage});
    lightboxContents(generateArticle(r.article.id, r.article.title, r.article.body, r.article.timestamp));
    return true;
}

Здесь, всякий раз, когда код выполняется (он маршрутизируется с помощью клика), мне отправляется сообщение об ошибке «r» не определен »- утверждение, которое, на мой взгляд, крайне неверно.

Я также попытался заменить 'r' глобальной переменной, используя объект 'window' - та же проблема.

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

Спасибо за ваше время! Тимон

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

r скорее всего не определено, поскольку похоже, что makeRequest является асинхронным вызовом AJAX, что означает, что его функция обратного вызова только вызывается после завершения запроса.Поскольку вызов асинхронный, среда выполнения JS там не ждет и продолжает выполнять операторы после него, которые в вашем случае являются вызовами changeBackground и generateArticle.Однако, поскольку вызов AJAX к этому времени не вернулся, и обратный вызов не был вызван, r по-прежнему равен нулю.Таким образом, попытка получить доступ к любому свойству r, например r.bgColor, приведет к ReferenceError.

0 голосов
/ 11 июля 2011

Похоже, вы пытаетесь использовать r, прежде чем дать ему значение, пока оно все еще null. Когда вы загружаете свою страницу, история отсутствует, поэтому r не получит значение. И тогда у вас есть асинхронная функция, присваивающая значение r, но код, которому необходимо r, чтобы иметь значение, будет запущен до выполнения асинхронного кода.

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