我正在研究用于学习目的的各种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不应该再引用传入的原始数组了吗?在我的理解中,我在这里错过了什么?
答案 0 :(得分: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)。