每次我需要使用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;
你知道怎么样?有些想法?
答案 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
设置为this
或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];
}
});
是的,它可能很俗气,但不管有效。