JavaScript代码模块的范围和/或持久性有哪些?

时间:2014-08-31 08:19:00

标签: scope firefox-addon persistence firefox-addon-restartless jsm

尝试使用自举扩展,我试图通过在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模块上的持久属性?

2 个答案:

答案 0 :(得分:2)

documentation非常简单明了共享的内容和方式

  

导入模块的每个范围都会收到一个按值的副本   在该模块中导出符号。对符号值的更改将会   不传播到其他范围(虽然对象的属性将是   由参考操纵)。

我认为随附的例子很清楚。

也许你应该使用getters/setters

答案 1 :(得分:1)

据我所知:

  • 其他jsm模块
  • 浏览器窗口
  • 内容窗口
  • bootstrap插件范围