8

我想添加到全局命名空间的对象中有一些属性。在浏览器上的 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 没有全局窗口对象,所以我不能这样做。是否有等效的对象或其他方式来完成此任务?

4

5 回答 5

11

我在NCZOnline找到了一个相当出色的解决方案:

function getGlobal(){
  return (function(){
    return this;
    }).call(null);
}

这个函数的关键是 this 对象在你使用时总是指向全局对象,call()或者apply()传入 null 作为第一个参数。由于空范围无效,解释器插入全局对象。该函数使用内部函数来确保范围始终正确。

调用使用:

var glob = getGlobal();

glob然后将返回[object global]犀牛。

于 2010-03-23T18:59:04.613 回答
7

您可以使用this, 如果当前函数没有作为对象的方法调用,则它指的是全局对象。

于 2009-07-22T04:14:37.203 回答
5

以下是我过去的做法:

// Rhino setup
Context jsContext = Context.enter();
Scriptable globalScope = jsContext.initStandardObjects();

// Define global variable
Object globalVarValue = "my value";
globalScope.put("globalVarName", globalScope, globalVarValue);
于 2009-07-22T04:33:01.377 回答
1

您可以将自己的window对象定义为顶级变量:

var window = {};

然后,您可以根据需要为其分配值。(window不过,在这种情况下,“”可能不是最好的变量名。)

另请参阅:我可以为在 Java6 Rhino 脚本引擎中运行的 javascript 创建一个“窗口”对象吗

于 2009-07-22T04:17:29.660 回答
-1

我没用过 rhino 但你不能只用 var 吗?

IE


var foo = myObject.foo;
foo();

编辑:该死的知道会有一个陷阱!在这种情况下,迈尔斯的建议是可行的。

于 2009-07-22T04:05:53.287 回答