Javascript变量未在函数范围内声明

时间:2011-07-11 02:58:46

标签: javascript function scope

我最近使用MooTools开发了一些简单的AJAX函数。我的问题在于紧随其后的代码:

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'未定义” - 这个陈述在我看来是非常不正确的。

就此而言,我也尝试使用'window'对象用全局变量替换'r' - 同样的问题。

我对这个简单的问题感到困惑,如果有新眼睛的人可以指出我的错误,那将是世界的感激。

感谢您的时间! 蒂莫

2 个答案:

答案 0 :(得分:3)

r很可能是未定义的,因为看起来makeRequest是异步AJAX调用,这意味着一旦请求完成,其回调函数仅 被调用。由于调用是异步的,因此JS运行时不会在那里等待,并继续执行它后面的语句,在您的情况下是对changeBackgroundgenerateArticle的调用。但是,由于此时尚未返回AJAX调用且尚未调用回调,因此r仍为空。因此,尝试访问r r.bgColor上的任何媒体资源都会引发ReferenceError

答案 1 :(得分:0)

在您给它一个值之前,似乎您正在尝试使用r,而它仍然是null。加载页面时,没有历史记录,因此r不会获得值。然后你有一个异步函数为r赋值,但是需要r来获取值的代码将在异步代码执行之前运行。