Как добавить свойство объекта в глобальный объект в 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();
изменить: Черт, я знал, что будет подвох! В таком случае предложение Майлза будет принято.