JavaScript变量作用域如何适用于IIFE私有名称空间内的变量?

JavaScript变量作用域如何适用于IIFE私有名称空间内的变量?,javascript,scope,var,encapsulation,Javascript,Scope,Var,Encapsulation,这是一个背驮另一个我问。这个问题在评论中已经解决了,所以我不想寻找答案。我想在这里了解变量作用域: var JOHNNY = (function() { var module = {}; function getData(id, callback){ var xhr = new XMLHttpRequest(); var url = "http://someurl/api/5";

这是一个背驮另一个我问。这个问题在评论中已经解决了,所以我不想寻找答案。我想在这里了解变量作用域:

 var JOHNNY = (function()
    {
        var module = {};
        function getData(id, callback){
                var xhr = new XMLHttpRequest();
                var url = "http://someurl/api/5";

                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4 && (xhr.status == 200)) {
                        callback(xhr.response);
                    }
                };

                xhr.open("GET", url, true);
                xhr.responseType = 'json';
                xhr.send(null);

        }
        function myCallBack(data){
            return data;  //console.log works;
        }
        module.getStuff=function(id){
            return getData(5, myCallBack);  //just hardcoded id here
        }
        return module;
    })();
我知道为什么这不起作用,因为异步通信。所以,我明白了

JOHNNY.getStuff(5);
undefined
再一次,我知道这是为什么。这不是我要问的部分(异步部分)

我的问题与这部分有关:

如果我这样做,我就能得到数据

function myCallBack(data){
    module.test = data;
}
然后呢,

  JOHNNY.test;  
//has the answer, 5,; this assumes the callback has been called for the questions sake.
回调将数据分配给回调中的var
模块
myCallBack
,我不会依赖于即时回答,这是不可靠的,等等


我不明白的是,在调用函数并创建了对JOHNNY的引用之后,如何更新私有名称空间中的
模块
变量

在控制台里我已经打过电话了

约翰尼·盖斯特(5)


模块
是否已在生命周期中返回?变量
module
不要求在此处使用原型来更新所有事件?

module只是一个引用对象,这意味着您对它所做的任何赋值都会使该对象发生变异。“对JOHNNY的引用已经创建了。”-您在此处丢失了我。请理顺你的动词、名词和代词。这个问题可能会有帮助:因为你使用iLife,
JOHNNY
最终被分配到
module
(iLife返回),即:
JOHNNY=module
@Igor我删除了“it”这个词