Javascript 范围和命名空间问题

Javascript 范围和命名空间问题,javascript,namespaces,scope,Javascript,Namespaces,Scope,为了学习,我检查了各种JavaScript库。基本上,我想找到初始化名称空间的最佳方法,并查看专业人员如何加载其库中的所有相关文件。我在库用户在几个库中调用的主文件(例如,让我们称之为myNameSpace.js)中多次遇到此问题: (function() { var jsFiles = window.MyNameSpace; window.MyNameSpace = { _getScriptLocation: (function() {

为了学习,我检查了各种JavaScript库。基本上,我想找到初始化名称空间的最佳方法,并查看专业人员如何加载其库中的所有相关文件。我在库用户在几个库中调用的主文件(例如,让我们称之为myNameSpace.js)中多次遇到此问题:

(function() {

    var jsFiles = window.MyNameSpace;

    window.MyNameSpace = {
        _getScriptLocation: (function() { 
            /* some code here */ 
        })
    };

    if(!jsFiles) { 
        jsFiles = [/* An array of ALL the library files! */];
    }

    for(var i=0, len = jsFiles.length; i<len; i++) { 
        scriptTags[i] = "<script src='" + jsFiles[i]  + "'></script>"; 
    }

    if(scriptTags.length > 0) { 
        document.write(scriptTags.join("")); 
    }

})();
(函数(){
var jsFiles=window.MyNameSpace;
window.MyNameSpace={
_getScriptLocation:(函数(){
/*这里有一些代码*/
})
};
如果(!jsFiles){
jsFiles=[/*所有库文件的数组!*/];
}
对于(var i=0,len=jsFiles.length;i0){
document.write(scriptTags.join(“”);
}
})();
因此,在这种设置中,如果库用户希望只包含库的某些部分,他们将在加载myNameSpace.js之前通过以下方式进行指定:

<script type='text/javascript'> window.MyNameSpace = ["libraryFile1.js", "libraryFile2.js", "libraryFile3.js"]</script>
<script type='text/javascript' src="MyNameSpace.js"></script>
window.MyNameSpace=[“libraryFile1.js”、“libraryFile2.js”、“libraryFile3.js”]
我的问题是,window.MyNameSpace是一个对象,如果脚本将jsFiles作为window.MyNameSpace分配给数组设置,这将是一个引用分配,对吗?但在这一行之后,window.MyNameSpace立即被完全更改。那么,JSF文件不应该不再引用传入的原始数组了吗?在我的理解中,我遗漏了什么

JS不“通过引用”分配,分配是复制,但当我们分配对象时,我们复制它们的地址,而不是对象“自身”

window.MyNameSpace
指向内存中的某个对象。假设它的地址是0x12345

var jsFiles = window.MyNameSpace;
jsFiles
现在指向同一个对象(0x12345)


window.MyNameSpace
现在指向另一个对象(设为0x56789),但
jsFiles
仍然指向第一个对象(0x12345)。

这显然是正在发生的事情。我不明白的是,我以为分配给数组的变量会通过引用来分配。@renosis:术语因语言而异,但在javascript中,分配(和调用)不是通过引用。“通过引用”意味着您可以创建互相别名的变量。php支持,但不支持javascript。好的,谢谢。我想我只是被弄糊涂了,因为我会尝试复制一个数组,然后数组会改变,它也会在副本中改变。我想我看到了这里的区别。
var jsFiles = window.MyNameSpace;
window.MyNameSpace = {...}