2

因此,在 Firefox 扩展中,鼓励扩展的对象存在于 com.contoso.myExtension 之类的子对象中。这样,您就没有将任何对象放在全局命名空间中,并且扩展通常不会互相影响。(至少在常见的 browser.xul 窗口中)

但是根据我对Javascript 代码模块 (JSM)的了解,虽然模块本身在单独的命名空间中工作,但它导出的符号最终会出现在导入它的任何代码的全局命名空间中。此外,扩展不可能是“好的”并且只尝试构建子对象;这些导出的符号只会破坏已经存在的任何全局变量。您也不能导出像 com.contoso.myExtension 这样的符号。它只是一个简单的全局变量。

那么在使用 JSM 时玩得更好的协议是什么?只是制作很长的变量名并希望它们不会发生冲突?

4

1 回答 1

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);
})();
于 2011-04-30T21:36:28.017 回答