我刚刚开始使用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?'
即使可以用这种方式编写模块,是否有充分的理由不这样做?
答案 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();
我想我更喜欢第一种方法的外观。