0

有人可以向我解释checkX()' 范围有什么问题吗?我怀疑这是错误的,匿名函数以某种方式阻止了它,但我不确定如何绕过它。

storage = chrome.storage;

function checkX(){
    var x = false;

    storage.sync.get(function(data){
        if(data.x == true){
                x = true;
                console.log(x); // << x : true
        }
    });

            console.log(x); // << x : false
    return x;
}

console.log 结果顺序:

x : false
x : true
4

2 回答 2

1

两件事可能——也可能会——让你失望:

  1. JavaScript 区分大小写
  2. 您使用的get方法是异步的,您的 IIFE 在执行传递的回调函数之前返回,因此x无论如何它都会在回调更改它之前返回值。

编辑:
get方法只是一个getter,足够公平,但是之间有一个主要区别chrome.storage.sync.get,它使用谷歌同步获取数据,和chrome.storage.local.get使用对象(几乎)相同localStorage,具有事件的额外好处。至少,Google 的文档乍一看是这样告诉我的?

来自下面的评论:
这里的问题是 JS 如何以及何时调用回调函数。即使 OP 使用的 getter 正在获取本地数据,IIFE 也必须先返回,然后 JS 作为单线程才能调用回调。这就是 IIFE 回归的原因false

于 2013-01-30T08:17:23.177 回答
0

Javascript 区分大小写。您正在做的是创建一个全局变量xtrue而局部变量X仍然存在false

storage = chrome.storage;

function checkX(){
    var X = false;

    storage.sync.get(function(data){
        if(data.x == true){
            x = true;  <--- global variable
        }
    });

    return x;
}

另一个问题是,如果storage.sync.get从“checkX”异步运行,这意味着首先您返回 x,只有稍后(在您返回它之后)才会执行您的函数。如果 storage.sync.get 是一个 ajax 调用,这肯定会发生。

于 2013-01-30T08:17:04.713 回答