我刚刚开始使用 javascript 模块(而不是尝试 XPCOM 组件)编写我的第一个 FF 扩展,但我不清楚加载 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?'
即使模块可以这样写,是否有充分的理由不这样做?
最佳答案
它以闭包方式运行,但前提是您在某处引用它。在我的扩展中,我有类似的东西:
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();
我想我只是更喜欢第一种方法的外观。
关于firefox-addon - Firefox 扩展 javascript 模块 : what happens to unexported symbols?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5138660/