Javascript变量未在函数中声明';s范围

Javascript变量未在函数中声明';s范围,javascript,function,scope,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 = his

我最近一直在使用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;
}
函数更改页(id、url){
var c=假,
r=null;
对于(i=0;i
在这里,每当代码被执行时(通过点击路由),我都会收到一个错误“'r'未定义”-在我看来,这是一个非常不正确的语句

就这一点而言,我也尝试过使用“窗口”对象将“r”替换为全局变量-同样的问题

我曾经对这个简单的问题感到困惑,如果有人能用新的眼光指出我的错误,我将不胜感激

谢谢你的时间!
Timon

r
很可能未定义,因为它看起来像是一个异步AJAX调用,这意味着它的回调函数只有在请求完成后才被调用。由于调用是异步的,JS运行时不会在那里等待,而是在调用之后继续执行语句,在您的例子中,这些语句是对
changeBackground
generateArticle
的调用。但是,由于此时AJAX调用尚未返回,并且回调也未被调用,
r
仍然为空。因此,尝试访问
r
上的任何属性,如
r.bgColor
,都会抛出
引用错误

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

如果执行
console.log(r)
,您会得到什么?听起来好像
r
没有分配它的值(可能是由于某些错误)。我有一种感觉,这可能是问题所在。你觉得我最好怎么做?用每个函数中的代码填充回调函数,或者有更优雅的方式吗?将代码移到ajax回调中是一种方法。根据需要组织代码信息函数或模块。但是启动点将是ajax回调。好的,非常感谢您的帮助。省去了我几天痛苦的修修补补!