返回值包含在javascript中的匿名函数

时间:2013-01-30 08:13:52

标签: javascript scope anonymous-function

有人可以向我解释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

2 个答案:

答案 0 :(得分:1)

可能 - 并且可能会抛出你的两件事:

  1. JavaScript是区分大小写的
  2. 您使用的get方法异步,您的IIFE在执行传递的回调函数之前返回,因此它将返回{{1}的值无论如何,在回调改变之前。
  3. 编辑:
    x方法只是一个吸气剂,相当公平,但get(使用谷歌同步获取数据)和chrome.storage.sync.get(几乎)相同之间存在重大差异使用chrome.storage.local.get对象的事情,以及事件的额外好处。至少,这是Google's docs乍一看告诉我的内容?

    来自以下评论:
    这里的问题是JS如何以及何时调用回调函数。尽管OP使用的getter是获取本地数据,但是在JS作为单线程之前,IIFE必须先返回,才能调用回调。这就是IIFE返回localStorage的原因。

答案 1 :(得分:0)

Javascript区分大小写。你正在做的是创建一个x的全局变量true,而局部变量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调用,肯定会发生这种情况。