gpt4 book ai didi

Javascript代码模块相互导入[Firefox addon]

转载 作者:行者123 更新时间:2023-11-30 05:39:14 25 4
gpt4 key购买 nike

我在为 Firefox 插件使用 JavaScript 代码模块时遇到了这种奇怪的行为。我不确定这是错误还是相互导入的糟糕设计。

假设有 3 个模块 a、b 和 c。

a.js

var EXPORTED_SYMBOLS = ["a"];                                                       
Components.utils.import("resource://mymodule/c.js");
Components.utils.import("resource://mymodule/b.js");

var a = {
init: function() {
dump("A init\n");
b.init();
}
};

b.js

var EXPORTED_SYMBOLS = ["b"];
Components.utils.import("resource://mymodule/c.js");

var b = {
init : function() {
try {
dump("B init\n");
dump(c.foo() + "\n");
} catch (e) {
dump("Error C init : " + e.message + "\n");
}
}
};

c.js

var EXPORTED_SYMBOLS = ["c"];
Components.utils.import("resource://mymodule/b.js");

var c = {
foo : function() {
return "C Foo";
},
};

a.init() 被外部调用。现在使用上面的代码,我从 b 中找到了 'c' 的未定义。

A init
B init
Error C init : c is undefined

经过一些故障排除后,我意识到要更正此问题,

  • 我可以交换 a.js 中的导入(b 在 c 之前导入)
  • 或者我可以删除相互导入(从 c 中删除 b 的导入)使用其中任何一个,事情都会顺利进行。

在我的实际代码中,b 和 c 代表一些 UI 相关的东西,它们相互依赖。我可以完全摆脱模块的相互导入,并为其中之一注册一个回调函数。但我想知道是什么导致了这种行为。据我了解the documentation对于模块之间的导入没有任何严格的指导方针。我也知道 one module when imported multiple times will be shared因为模块的缓存。但不知何故无法解释这一点。我在这里做错了什么?

最佳答案

我对正在发生的事情有一个理论,但我还没有尝试在调试器中运行代码来确保:

  • a.js 运行并导入 c.js
  • c.js 运行并导入 b.js(在定义 c 之前!)
  • b.js 运行并导入 c.js。但是 c.js 不会再次运行,因为它之前已经导入过一次。
  • 因为 c 在 c.js 范围内仍然是未定义的(因为 c.js 还没有继续运行,它还在等待 import 调用第 2 行返回),c = undefined 被注入(inject) b.js 作用域。
  • b.js 执行完毕。
  • c.js 执行完毕。
  • a.js 执行完毕。

所以 b.js 永远不会收到 c 的有效绑定(bind),并且 b.init() 在尝试访问 c.foo< 时抛出异常.

如果这个理论是正确的,我认为您可以通过将 b.js 和 c.js 中的导入调用移动到这些文件的底部来修复错误。

关于Javascript代码模块相互导入[Firefox addon],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21715188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com