如何在rhino javascript中将对象属性添加到全局对象

时间:2009-07-22 04:01:29

标签: javascript rhino

我想在一个对象中添加一些属性,我想添加到全局命名空间。在浏览器的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没有全局窗口对象,所以我不能这样做。是否有相应的对象或其他方法来实现这一目标?

5 个答案:

答案 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();

编辑: 该死的知道会有一个捕获!迈尔斯的建议就是那种情况。