数组作用域问题



我已经看了几个小时了,我真的不明白为什么这不起作用。我以为我理解作用域,但我认为这与。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)为空的原因:

  1. INSTAJAM.media.popular可能是一个异步函数(它调用它的回调稍后可能作为ajax调用的结果),当你做第二个console.log(filters);, ajax调用尚未完成,所以你的回调填充全局filters变量尚未被调用或运行。
  2. var filters = [];不是真正全局的。
  3. 在作用域中还有另一个名为filters的变量,所以你实际上没有修改全局变量。

基于接受回调的INSTAJAM.media.popular的结构,我的猜测是#1。异步javascript意味着事情不会按照串行执行顺序发生。相反,您可以调用INSTAJAM.media.popular(fn)之类的东西,然后在ajax调用完成时调用回调。这意味着在调用INSTAJAM.media.popular(fn)之后的代码不能使用该调用的结果。相反,任何想要使用这些结果的代码都必须在回调本身中或从回调中调用。

可以参考window.filters

最新更新