JavaScript 代码模块的范围和/或持久性是什么?



试验引导扩展,我试图通过在bootstrap.js的模块对象上设置一个名为baseUri的属性来理解jsm模块的作用域和/或持久性,然后从我的options.xul(从附加组件管理器打开(中的javascript再次读取它。

我目前的理解是,JavaScript 代码模块在加载后是持久的。但是,当我尝试从options.xul访问baseUri时,它的值是 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 模块上的持久属性?

文档关于共享的内容和方式非常简单

导入模块的每个作用域都会收到 导出该模块中的符号。对符号值的更改将 不会传播到其他范围(尽管对象的属性将是 通过引用操纵(。

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

也许你应该使用getters/setters。

据我所知:

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

相关内容

  • 没有找到相关文章

最新更新