为什么我的全局变量不被另一个函数看到?

时间:2011-11-18 13:55:40

标签: javascript google-chrome-extension

这是我遇到的最烦人的问题:

var appslst = [];
function f1()
{
    chrome.management.getAll(function(lst)
    {
    appslst = lst;
    });
}

function f2() // this function isn't working!!
{
    var l = appslst.length;
    var ind = 0;
    while(ind < l)
    {
        document.getElementById("here").value = document.getElementById("here").value.concat(String(ind), ". ", appslst[ind].name, "\n");
        ind += 1;
    }
}

function f3()
{
     f1();
     f2();
}

我认为appslst - 因为它是一个全局变量 - 应该在函数f1()f2()中看到 但上面的代码不起作用,我不明白为什么。

另外,我尝试了以下代码(并且它正在运行):

var appslst = [];
function f1()
{
    chrome.management.getAll(function(lst)
    {
        appslst = lst;
        var l = appslst.length;
        var ind = 0;
        while(ind < l)
        {
            document.getElementById("here").value = document.getElementById("here").value.concat(String(ind), ". ", appslst[ind].name, "\n");
            ind += 1;
        }
    });
}

任何帮助非常感谢:) 提前谢谢:)

更多细节: 我正在学习如何为Google Chrome构建扩展程序。 我已下载示例:http://code.google.com/chrome/extensions/examples/extensions/app_launcher.zip 来自此链接:http://code.google.com/chrome/extensions/samples.html 我查看了代码并发现了我编写的相同代码,但它正在工作! 这是我正在谈论的部分:

function onLoad()
{
  chrome.management.getAll(function(info)
  {
    var appCount = 0;
    for (var i = 0; i < info.length; i++) {
      if (info[i].isApp) {
        appCount++;
      }
    }
    if (appCount == 0) {
      $("search").style.display = "none";
      $("appstore_link").style.display = "";
      return;
    }
    completeList = info.sort(compareByName);
    onSearchInput();
  });
}

1 个答案:

答案 0 :(得分:2)

chrome.management.getAll是异步的 - 因此,只有在Chrome执行getAll 时才需要传递执行的函数。

这意味着f1(); f2();会像这样:

  • f1被称为
  • getAll被调用(这是f1正在做的事情)
  • f2被称为
  • 迭代appslst(这就是f2正在做的事情)
  • (介于两者之间)
  • getAll已完成;传递给它的函数叫做
  • appslst填充了来自getAll的数据(这是传递的函数正在执行的操作)

换句话说,appslst在调用f2时仍为空。所以你还需要暂停f2()

chrome.management.getAll(function(lst){
    appslst = lst;
    f2(); // only run when getAll is done and appslst is filled
});