1

我正在检查各种 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("")); 
    }

})();

因此,通过此设置,如果库用户只想包含库的某些部分,他们将在加载 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 是一个对象,如果脚本将 jsFiles 分配给作为 window.MyNameSpace 的数组设置,这将是一个引用分配,对吗?但在那一行之后,window.MyNameSpace 立即被完全改变。那么jsFiles不应该不再引用传入的原始数组吗?在我的理解中,我在这里缺少什么?

4

1 回答 1

3

JS 没有“通过引用”赋值,赋值是复制,但是我们在赋值对象的时候,复制的是它们的地址,而不是对象“本身”。

window.MyNameSpace = ["libraryFile1.js", "libraryFile2.js", "libraryFile3.js"]

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

var jsFiles = window.MyNameSpace;

jsFiles现在指向同一个对象(0x12345)

window.MyNameSpace = {...}

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

于 2012-10-17T16:44:07.883 回答