尝试使用自举扩展,我试图通过在baseUri
的模块对象上设置一个名为bootstrap.js
的属性并再次读取它来了解jsm模块的范围和/或持久性来自我options.xul
中的javascript(从附加组件管理器打开)。
我目前的理解是JavaScript代码模块一旦加载就会保持不变。但是,当我尝试从baseUri
访问options.xul
时,其值为undefined
。
的install.rdf :
<!-- just the relevant XML (this works as expected, by the way): -->
<em:optionsURL>chrome://test/content/options.xul</em:optionsURL>
/modules/Test.jsm :
var EXPORTED_SYMBOLS = [ 'Test' ];
Test = {
baseUri: undefined
}
/bootstrap.js :
// this is done in global scope,
// not inside install() or startup() for instance, if that matters
let test = Components.utils.import( 'file:///absolute/path/to/Test.jsm', {} ).Test;
test.baseUri = someBaseUriIExtracted;
/chrome/content/options.js (包含在/chrome/content/options.xul
中):
let test = Components.utils.import( 'file:///absolute/path/to/Test.jsm', {} ).Test;
console.log( test.baseUri ); // undefined
所以,我想我无法完全理解的是我应该能够从导出的jsm符号访问对象属性的确切范围和/或这些对象如何以及何时被持久化。
我的问题与沙子拳击有什么关系吗?当从附加组件管理器打开时,Firefox是否会将options.xul
视为与bootstrap.js
不同的安全范围?
您能否详细了解jsm模块的实际范围以及我何时何地能够访问jsm模块上的持久属性?
答案 0 :(得分:2)
documentation非常简单明了共享的内容和方式
导入模块的每个范围都会收到一个按值的副本 在该模块中导出符号。对符号值的更改将会 不传播到其他范围(虽然对象的属性将是 由参考操纵)。
我认为随附的例子很清楚。
也许你应该使用getters/setters。
答案 1 :(得分:1)
据我所知: