数组范围问题

时间:2013-03-10 02:51:05

标签: javascript scope global

我环顾了几个小时,老实说我不明白为什么这不起作用。我虽然理解了范围,但我认为这与.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

2 个答案:

答案 0 :(得分:2)

这些是我能想到为什么你的第二个console.log(过滤器)为空的原因:

  1. INSTAJAM.media.popular可能是一个异步函数(稍后可能会因为ajax调用而调用它的回调),当你执行第二个console.log(filters);时,ajax调用尚未完成,所以你的填充全局filters变量的回调尚未调用或运行。
  2. var filters = [];并非真正全球化。
  3. 在范围内还有另一个名为filters的变量,因此您实际上并未修改全局变量。
  4. 基于INSTAJAM.media.popular进行回调的结构,我的猜测是#1。异步javascript意味着事情不会以串行执行顺序发生。相反,您调用INSTAJAM.media.popular(fn)之类的东西,稍后,当ajax调用完成时调用回调。这意味着在您致电INSTAJAM.media.popular(fn)后立即找到的代码无法使用该调用的结果。相反,任何想要使用这些结果的代码都必须在回调本身中,或者从回调中调用。

答案 1 :(得分:0)

您可以参考window.filters