如何将当前上下文设置为变量? (loadSubscript)

时间:2013-05-27 23:46:37

标签: javascript firefox-addon loading

每次我需要使用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;
你知道怎么样?有些想法?

2 个答案:

答案 0 :(得分:3)

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

var ctx = Object.create(window);

如果ctx是沙箱,那么您可以使用sandboxPrototype option

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

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

注意:我假设window是您的全局对象(定义全局变量的对象)。对于在XUL / HTML文档中运行的代码,情况也是如此。但是,在沙箱中运行的代码(例如引导加载项的bootstrap.js)将没有window对象 - 在那里您只能访问顶部的this全局对象 - 等级代码。

答案 1 :(得分:1)

也许您可以尝试将上下文ctx设置为thisnull 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];
    }
});

是的,它可能很俗气,但不管有效。