我想在一个对象中添加一些属性,我想添加到全局命名空间。在浏览器的javascript中,我可以将它添加到window
对象中,如下所示:
var myObject = {
foo : function() {
alert("hi");
}
// and many more properties
};
for (property in myObject) {
window[property] = myObject[property];
}
// now I can just call foo()
foo();
但是由于rhino没有全局窗口对象,所以我不能这样做。是否有相应的对象或其他方法来实现这一目标?
答案 0 :(得分:10)
我在NCZOnline找到了一个相当出色的解决方案:
function getGlobal(){
return (function(){
return this;
}).call(null);
}
此函数的关键是,只要您使用
call()
或apply()
,并且传入null作为第一个参数,此对象始终指向全局对象。 由于null作用域无效,解释器会插入全局对象。该函数使用内部函数来确保作用域始终正确。
使用以下方式致电:
var glob = getGlobal();
glob
然后会在Rhino中返回[object global]
。
答案 1 :(得分:7)
您可以使用this
,如果当前函数未被调用为对象的方法,则引用全局对象。
答案 2 :(得分:5)
以下是我过去的表现:
// Rhino setup
Context jsContext = Context.enter();
Scriptable globalScope = jsContext.initStandardObjects();
// Define global variable
Object globalVarValue = "my value";
globalScope.put("globalVarName", globalScope, globalVarValue);
答案 3 :(得分:1)
您可以将自己的window
对象定义为顶级变量:
var window = {};
然后您可以根据需要为其指定值。 (“window
”可能不是这种情况下最好的变量名。)
另请参阅:Can I create a 'window' object for javascript running in the Java6 Rhino Script Engine
答案 4 :(得分:-1)
我没有使用过rhino,但你不能只使用var?
即。
var foo = myObject.foo;
foo();
编辑: 该死的知道会有一个捕获!迈尔斯的建议就是那种情况。