我已经看了几个小时了,我真的不明白为什么这不起作用。我以为我理解作用域,但我认为这与。popular方法上的回调有关。任何建议吗?
var filters = []; //Global
INSTAJAM.media.popular(function(popular){
for (i in popular.data){
filters.push(popular.data[i].filter); //Pushing to Global
}
console.log(filters); //Works fine
});
console.log(filters); //Empty array
以下是我能想到的第二个console.log(filters)为空的原因:
-
INSTAJAM.media.popular
可能是一个异步函数(它调用它的回调稍后可能作为ajax调用的结果),当你做第二个console.log(filters);
, ajax调用尚未完成,所以你的回调填充全局filters
变量尚未被调用或运行。 -
var filters = [];
不是真正全局的。 - 在作用域中还有另一个名为
filters
的变量,所以你实际上没有修改全局变量。
基于接受回调的INSTAJAM.media.popular
的结构,我的猜测是#1。异步javascript意味着事情不会按照串行执行顺序发生。相反,您可以调用INSTAJAM.media.popular(fn)
之类的东西,然后在ajax调用完成时调用回调。这意味着在调用INSTAJAM.media.popular(fn)
之后的代码不能使用该调用的结果。相反,任何想要使用这些结果的代码都必须在回调本身中或从回调中调用。
可以参考window.filters