如何将变量传递给全局范围

时间:2013-04-06 14:14:04

标签: javascript google-chrome google-chrome-extension

问题 - 如何将变量传递到全局范围? :

var global_variable;

chrome.storage.local.get('ABC',function(result){
            global_variable = result; //pass result to global var.
});

console.log(global_variable); //outputs undefined, why!!!?

3 个答案:

答案 0 :(得分:2)

这只是因为console.log()'ABC',function(result){设置全局变量之前启动 因为chrome.storage.local.get是异步启动的。

要验证它,请测试以下代码:

var global_variable;
chrome.storage.local.get('ABC',function(result){
        global_variable = result; //pass result to global var.
        test();
});
function test() {
    console.log(global_variable);
}

答案 1 :(得分:1)

您正在异步函数回调中设置变量。在get操作完成后运行回调。

您的代码将按此顺序执行:

chrome.storage.local.get("ABC",callback);

然后

console.log();

然后

callback()

您可以通过在回调中放置一个console.log语句来验证它是否在当前回调之后运行。

Javascript函数在运行任何异步回调调用之前会运行完成。

这样写得更有意义,这相当于你现在所拥有的。

//define the callback
function callbackFunction(result){
      global_variable = result; //pass result to global var.
}

//run the get.  When it is complete the callback will be added to a queue 
//to run next after current operations have completed
chrome.storage.local.get('ABC',callback);

// this will run immediately after the get call
console.log(global_variable);

如果你想使用你的变量,你必须把逻辑放在回调中(或者在回调调用的单独函数中。

答案 2 :(得分:0)

我假设,不知道“结果”的返回值是什么,您希望将值传递给全局范围到尚未预定义的变量。以下回调更改将定义具有全局范围的新变量,并为其分配“结果”的值。请记住,该范围与窗口对象中的层次结构有关,而与脚本无关。

function callbackFunction(result){
    window.global_variable = result;
}
console.log(global_variable);

您还可以动态注入脚本标记,其中src属性是您的全局值。

function callbackFunction(result){
    var js = document.createElement('script');
    js.src = 'var global_variable = ' + result + ';';
    var first = document.getElementsByTagName('script')[0];
    first.parentNode.insertBefore(js, first);
}

虽然我认为这对于获得相同的结果似乎有点冗长。