array.push在FF中不起作用,但在Chrome中有效...任何想法?

时间:2012-01-26 21:31:32

标签: javascript jquery arrays

这仅适用于Chrome,而非FF:

    var menu = new Array();
    $.couch.db("foo").allDocs({
            success: function(d) {
                    for(var i=0;i<=d.total_rows-1;i++){
                            menu.push(d.rows[i].id);
                    };
            }
    });
    console.log(menu);

我可以在函数内部的console.log“菜单”,但不能在外面。这就像它失去了它的范围。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

一旦您收到来自$ .couch.db的回复,您的success功能稍后会被调用,因此当您到达console.log(menu);时,您仍会获得初始值。

答案 1 :(得分:0)

尝试声明var menu = [];而非new Array() - 它应该没有任何区别,但你永远不会知道。

另外,尝试将console.log(menu);放入循环中,然后看看......哦,等等。

忘掉上面的内容,我只是重新阅读代码。

我很确定allDocs()是一个异步函数。您在启动该功能后尝试访问结果,但在完成之前。所有依赖menu的代码必须位于success函数中。

答案 2 :(得分:0)

可能是你的函数异步工作,当你在函数外面的console.log(菜单)时它会显示菜单的原始状态。

例如,在jQuery中使用ajax函数时,您可以将参数“ async ”设置为 false ,以便将响应正确地分配给变量。

答案 3 :(得分:0)

问题是您正在将数据推送到回调内的菜单数组中。这意味着您的代码以某种方式执行:

  1. 创建新阵列
  2. 调用
  3. $。couch.db()做某事(某些异步任务,导致执行流继续)
  4. 调用console.log(),因为菜单为空,通常会打印一个空数组
  5. $。couch.db()完成了它的业务并且已经调用了你的“成功”回调来填充你的数组
  6. 但是,可能会出现在到达console.log()之前执行回调的情况......所以你真的在这里处理竞争条件。