Как добавить свойство объекта в глобальный объект в Rhino javascript

у меня есть некоторые свойства в объекте, который я хотел бы добавить в глобальное пространство имен. В 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 не имеет объекта global window, я не могу этого сделать. Есть ли эквивалентный объект или какой-то другой способ достичь этого?

5 ответов


можно использовать this, который ссылается на глобальный объект, если текущая функция не вызывается как метод объекта.


Я нашел блестящее решение в NCZOnline:

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

ключом к этой функции является то, что этот объект всегда указывает на глобальный объект в любое время, когда вы используете call() или apply() и передать null в качестве первого аргумента. поскольку область null недопустима, интерпретатор вставляет глобальный объект. функция использует внутреннюю функцию, чтобы гарантировать, что область всегда правильно.

звоните использование:

var glob = getGlobal();

glob затем вернется [object global] в Rhino.


вот как я это делал в прошлом:

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

// Define global variable
Object globalVarValue = "my value";
globalScope.put("globalVarName", globalScope, globalVarValue);

вы могли бы просто определить свой собственный window объект как переменная верхнего уровня:

var window = {};

затем вы можете назначить ему значения, как вам угодно. ("window " вероятно, это не лучшее имя переменной в этой ситуации.)

Читайте также: могу ли я создать объект "окно" для javascript, работающего в Java6 Rhino Script Engine


Я не использовал rhino, но не могли бы вы просто использовать var?

т. е.


var foo = myObject.foo;
foo();

изменить: Черт, я знал, что будет подвох! В таком случае предложение Майлза будет принято.