因此,在Firefox扩展中,鼓励扩展程序的对象存在于com.contoso.myExtension等子对象中。这样你就没有在全局命名空间中放置任何对象,并且扩展通常不会相互影响。 (至少在常见的browser.xul窗口中)
但是从我对Javascript code modules (JSMs)的理解来看,虽然模块本身在一个单独的命名空间中工作,但它导出的符号最终会在任何代码的全局命名空间中导入它。此外,扩展不可能“好”并且只能尝试构建子对象;那些导出的符号只会破坏已经存在的全局变量。此外,您无法导出com.contoso.myExtension等符号。它只是一个简单的全局变量。
那么使用JSM时玩好的协议是什么?只做很长的变量名称并希望它们不会发生碰撞?
答案 0 :(得分:3)
首先,我还没有看到一个真正的标准如何解决这个问题。但我们绝对可以比长变量名更好......
您对单独的命名空间中的Javascript代码模块是正确的(可以这么说),但是当您导入它们时,您不必将它们导入到全局命名空间中。如果查看Components.utils.import文档,您会看到可以导入到特定范围。也就是说,您根本不必污染全局命名空间。
您可以将模块收集到myExtension
命名空间。
var myExtension = {};
Components.utils.import("resource://.../module.jsm", myExtension);
将其包装在一个自执行函数中不会让任何变量泄漏到全局命名空间,甚至不会myExtension
!
(function(){
var myExtension = {};
Components.utils.import("resource://.../module.jsm", myExtension);
})();