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

tim*_*ney 7 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();
Run Code Online (Sandbox Code Playgroud)

但由于rhino没有全局窗口对象,我无法做到这一点.有没有一个等效的对象或其他方式来实现这一目标?

pne*_*ook 10

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

function getGlobal(){
  return (function(){
    return this;
    }).call(null);
}
Run Code Online (Sandbox Code Playgroud)

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

使用呼叫:

var glob = getGlobal();
Run Code Online (Sandbox Code Playgroud)

glob然后将返回[object global]Rhino.


Mil*_*les 7

您可以使用this,如果当前函数未被调用为对象的方法,则引用全局对象.

  • var window = this; 在脚本的最开始帮助我.请参阅John Resig的env.js脚本http://ejohn.org/blog/bringing-the-browser-to-the-server/ (2认同)

小智 5

以下是我过去的做法:

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

// Define global variable
Object globalVarValue = "my value";
globalScope.put("globalVarName", globalScope, globalVarValue);
Run Code Online (Sandbox Code Playgroud)