【问题标题】:Array Scope Issue数组范围问题
【发布时间】:2013-02-25 10:26:28
【问题描述】:

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

【问题讨论】:

  • 你的方法很可能是异步的。
  • 谁在打电话给INSTAJAM.media.popular

标签: javascript scope global


【解决方案1】:

这些是我能想到的为什么您的第二个 console.log(filters) 为空的原因:

  1. INSTAJAM.media.popular 可能是一个异步函数(它在稍后的某个时间调用它的回调可能是 ajax 调用的结果),当您执行第二个 console.log(filters); 时,ajax 调用尚未完成,因此您的回调填充了全局 @987654323 @ 变量尚未被调用或运行。
  2. var filters = []; 并不是真正的全球性。
  3. 范围内还有另一个名为 filters 的变量,因此您实际上并未修改全局变量。

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

【讨论】:

  • 我检查了选项 2 和 3,所以它必须是 #1。有什么办法吗?
  • @MateiGheorghiu - 重构您的代码以使用我在上一段中描述的异步操作。如果INSTAJAM.media.popular() 是异步的,那是唯一的方法。
  • 伙计,很抱歉让我感到痛苦,但我以前从未使用过异步函数。我不知道该去哪里。
  • @MateiGheorghiu - 所有在回调中使用结果的代码都必须在回调中或从回调中调用。它不可能在其他任何地方。您不能使用异步函数按顺序编程。相反,您必须将所有使用异步调用结果的后续代码放入回调本身。这是一种不同的结构,但却是唯一的方法。
【解决方案2】:

可以参考window.filters

【讨论】:

    猜你喜欢
    • 2013-05-18
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多