所以在Firefox扩展中,它鼓励您的扩展对象驻留在像com.contoso.myExtension这样的子对象中。这样,您就不会在全局命名空间中放置任何对象,并且扩展通常不会相互干扰。(至少在普通浏览器中是这样。xul窗口)
但是从我对Javascript代码模块(JSMs)的理解来看,虽然模块本身在单独的命名空间中工作,但它导出的符号最终将在任何代码导入的全局命名空间中结束。此外,一个扩展不可能是"好"的,只试图构建子对象;那些导出的符号只会破坏任何已经存在的全局变量。你也不能导出像com.contoso.myExtension这样的符号。它只是一个简单的全局变量。
那么在使用JSMs时使用什么协议来玩得好呢?用很长的变量名,希望它们不会冲突?
首先,我还没有看到一个真正的标准如何处理这个问题。但我们肯定可以做得比长变量名更好…
你是正确的关于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);
})();