Javascript变量未在函数中声明';s范围
我最近一直在使用MooTools开发一些简单的AJAX函数。我的问题在于下面的代码: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
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回调。好的,非常感谢您的帮助。省去了我几天痛苦的修修补补!