1

每次我需要使用loadSubscript加载脚本时,我都必须将所有“需要的变量”复制到该上下文中。例如:

var ctx;
ctx.window = window;
ctx.console = window.console;
ctx.MyOwnClass1 = MyOwnClass1;
ctx.MyOwnClass2 = MyOwnClass2;
ctx.MyOwnClass3 = MyOwnClass3;

Services.scriptloader.loadSubScript("file://" + filePath, ctx, "UTF-8"); 

如果我有 2 或 3 个类,那不是问题,但现在我需要上下文知道 20 个类。因此,我认为必须有某种方法可以将当前上下文设置为变量。就像是:

var ctx = this.context;

你知道如何?有什么想法?

4

2 回答 2

3

您应该使用自己的上下文作为加载脚本的 JavaScript 上下文的原型。如果ctx是常规对象,则可以使用Object.create()

var ctx = Object.create(window);

如果ctx是沙箱,那么您可以使用以下sandboxPrototype选项

var ctx = new Components.utils.Sandbox(systemPrincipal, {sandboxPrototype: window});

所有可用的属性window(包括全局函数/变量)将自动在ctx对象上可用。

注意:我在这里假设这window是您的全局对象(定义全局变量的对象)。这对于在 XUL/HTML 文档中运行的代码是正确的。但是,在沙箱中运行的代码(例如bootstrap.js,引导加载项)不会有window对象——在那里您只能访问this顶级代码中的全局对象。

于 2013-05-28T08:22:07.303 回答
1

也许您可以尝试将上下文设置ctxthisor 或null. loadSubscript文档确实声明它是一个可选参数。


早期编辑的其他答案:

如果你敢,你可以尝试摆弄:

Object.keys(this)Object.getOwnPropertyNames(this)

使用 Firefox 的devtools:scratchpad

var v1,v2,v3;
function MyClass1(){};
function MyClass2(){};
function MyClass3(){};
[Object.keys(this).join(", "),Object.getOwnPropertyNames(this).join(", ")].join("\n");

/*
outputs:
__SCRATCHPAD__, v1, v2, v3, MyClass1, MyClass2, MyClass3
Object, Function, eval, Components, ... ... , ArrayBuffer, WeakMap, Map, Set, Proxy
*/

有了它,您可以组合一个片段来过滤感兴趣的类名,如下所示(this在全局范围内):

Object.keys(this).forEach(function(key){
    if(key.match(/^SomeNamespacedClassName/)){
        ctx[key] = this[key];
    }
});

是的,它可能很俗气,但无论如何都有效。

于 2013-05-28T01:12:06.327 回答