2011-11-18 64 views
0

这是我有史以来所面临的最恼人的问题:为什么我的全局变量不被另一个函数看到?

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 - 因为它是一个globla变量 - 应该在这两个功能可见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(); 
    }); 
} 

回答

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 
}); 
+0

那么为什么样本的代码是woking?注意'completeList'也是一个全局变量。感谢您的帮助:) – joker

+0

如果您的意思是最后一个代码示例 - 它们也在传递给'getAll'的函数中进行迭代,并且当时您想要迭代的数据可用。 – pimvdb

+0

只有2个最后的问题:1.如果我想将数据复制到全局变量,我应该怎么做? 2.有什么链接可以学到更多? – joker

相关问题