Firefox扩展javascript模块:未导出的符号会发生什么?

时间:2011-02-28 05:49:21

标签: firefox-addon javascript

我刚刚开始使用javascript模块编写我的第一个FF扩展(而不是尝试XPCOM组件),但我对加载jsm时发生的事情很模糊。

问:文件范围是否作为非导出符号的闭包,或者是仅仅是垃圾收集的未引用符号?

例如,可以/应该按如下方式编写模块吗?

//modules/myModule.js
var EXPORTED_SYMBOLS = [ 'foo', 'bar' ];

var data;

function foo(){
   return data;
}

function bar(newData){
   data = newData;
}

将其导入其他地方:

var aNS = {};
Components.utils.import("resource://myext/myModule.js", aNS);
aNS.bar('it works?');
alert(aNS.foo()); //alert: 'it works?'

即使可以用这种方式编写模块,是否有充分的理由不这样做?

1 个答案:

答案 0 :(得分:3)

它以封闭方式运行,但只有在某个地方引用它时才会这样。在我的扩展中,我有类似的东西:

var EXPORTED_SYMBOLS = ['foo'];
let cacheService = Components.classes["@mozilla.org/network/cache-service;1"]
                    .getService(Components.interfaces.nsICacheService);
let foo = {
   svc : cacheService,
   dosomethingwithit : function(){this.svc.somemethod();}
}

因为它被foo.svc引用,我的cacheService运行良好。如果我没有在任何地方引用它,那么它将被垃圾收集 - 这并不奇怪,因为如果不使用谁会关心。

但现在想更多关于它,我只是在徘徊为什么我这样做。没有多大意义,也没有区别。我可以有类似的东西:

var EXPORTED_SYMBOLS = ['foo'];

function something(){
    this.svc = Components.classes["@mozilla.org/network/cache-service;1"]
                    .getService(Components.interfaces.nsICacheService);
}
let foo = new something();

我想我更喜欢第一种方法的外观。