如何将参数传递给Javascript模块?

如何将参数传递给Javascript模块?,javascript,module,jsm,Javascript,Module,Jsm,我希望在Xul应用程序的单个窗口中使用(JSM),以便可以根据需要加载资源 但是,我需要将窗口传递给JSM,我不知道如何做。按照我的尝试: 在myresource.jsm中: var EXPORTED_SYMBOLS = ["hello"]; function hello(win) { win.alert("ALERT FROM JSM!"); } 在我的窗口中呼叫: Components.utils.import("resource://module/resource.jsm");

我希望在Xul应用程序的单个窗口中使用(JSM),以便可以根据需要加载资源

但是,我需要将窗口传递给JSM,我不知道如何做。按照我的尝试:

在myresource.jsm中:

var EXPORTED_SYMBOLS = ["hello"];

function hello(win) {
    win.alert("ALERT FROM JSM!");
}
在我的窗口中呼叫:

Components.utils.import("resource://module/resource.jsm");
hello(window);
但我得到:

胜利是不确定的

在resource.jsm中


知道如何使其工作吗?

您将
hello
函数的参数命名为
窗口可能会导致问题。虽然window不是保留字,但大多数浏览器环境都将其视为不可分配的排序常量。尝试:

function hello( obj ) {
    obj.alert("ALERT FROM JSM!");
}
然后用
hello(window)
hello(document.window)
hello(this)


在阅读Javascript模块文档之后,看起来您需要在模块内创建一个对象,然后通过引用更改其属性。因此,在JSM中:

var EXPORTED_SYMBOLS = ["params", "hello"];

params = {
  win: this
};

function hello() {
    params.win.alert("ALERT FROM JSM!");
}
然后,您可以通过首先将窗口分配给该参数,然后调用函数来调用:

Components.utils.import("resource://module/resource.jsm");
params.win = window;
hello();

注意:我对JSMs不太熟悉,不知道是否有更好的方法来实现这一点,但这应该是可行的。

只是出于好奇,如果您首先指定
window=window
,会发生什么?我记得听到一些关于某些“预定义”全局变量的非常奇怪的问题,这些问题(以某种方式)通过自我分配解决了…@Platinum Azure我收到了相同的错误消息。@Platinum Azure我想你看到的是这个。不,是关于设置超时。。。很抱歉我知道这是一个远大的目标,因此把它放在一个评论而不是一个答案中。用另一个解决方案更新了答案。非常好的观察。但是我得到了
params.win.alert不是一个函数
。通过将
param.win
声明为
null
我意识到它没有被分配,因为我在
alert()
调用中得到
params.win为null
。作业前(或作业中)有点不对劲。。(如果我找到了什么,我会在这里发布)哦,天哪,我的一些测试很糟糕,因为我没有更新构建id,所以它运行的是缓存的东西,过时了。现在它正在工作,甚至可以正常地将窗口作为参数传递。谢谢你和我一起做这件事!