8 Stimmen

Wie kann ich eine Objekt-Eigenschaft, um das globale Objekt in rhino javascript hinzufügen

Ich habe einige Eigenschaften in einem Objekt, das ich dem globalen Namespace hinzufügen möchte. In Javascript auf dem Browser könnte ich sie einfach zum window Objekt wie folgt:

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

Aber da Rhino das globale Fensterobjekt nicht hat, kann ich das nicht tun. Gibt es ein gleichwertiges Objekt oder eine andere Möglichkeit, dies zu erreichen?

0 Stimmen

Ich habe herausgefunden, wie man das machen kann, ohne zusätzliches Javascript schreiben zu müssen: stackoverflow.com/a/60783337/473201

11voto

pnewhook Punkte 4029

Ich habe eine ziemlich geniale Lösung gefunden unter NCZOnline :

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

Der Schlüssel zu dieser Funktion ist, dass das this-Objekt immer auf das globale Objekt zeigt, wenn Sie die Funktion call() o apply() und geben Sie null als erstes Argument ein. Da ein Nullbereich nicht gültig ist, fügt der Interpreter das globale Objekt ein. Die Funktion verwendet eine innere Funktion, um sicherzustellen, dass der Anwendungsbereich immer korrekt ist.

Rufen Sie an:

var glob = getGlobal();

glob wird dann zurückgegeben [object global] in Nashorn.

0 Stimmen

Hervorragend! Denken Sie daran, dass dies nicht im ES5 Strict-Modus funktioniert, so dass Ihr Skript fehlschlagen kann, sobald Rhino führt die ES5-Konformität ein .

1 Stimmen

Coolen Dank. function getGlobal(){return (function(){return this})()} ist einfacher und gleichwertig (vom Autor bestätigt)

0 Stimmen

@user123444555621, Warum sollte das im ES5 Strict-Modus nicht funktionieren?

7voto

Miles Punkte 29684

Sie könnten verwenden this die sich auf das globale Objekt bezieht, wenn die aktuelle Funktion nicht als Methode eines Objekts aufgerufen wird.

2 Stimmen

Var window = this; ganz am Anfang des Skripts hat mir weitergeholfen. Siehe das env.js-Skript von John Resig ejohn.org/blog/den-browser-auf-den-server-bringen

0 Stimmen

@Miles, Hmm, meinst du nicht, dass die Lösung von pnewhook besser ist?

5voto

edsoverflow Punkte 591

So habe ich es in der Vergangenheit gemacht:

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

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

0 Stimmen

Warum verwenden Sie nicht einfach this ?

1voto

harto Punkte 87633

Sie könnten einfach Ihre eigene window Objekt als Top-Level-Variable:

var window = {};

Sie können ihm dann nach Belieben Werte zuweisen. (" window " ist wahrscheinlich nicht der beste Variablenname in dieser Situation).

Siehe auch: Kann ich ein 'Fenster'-Objekt für Javascript erstellen, das in der Java6 Rhino Script Engine läuft?

-1voto

rezzif Punkte 460

Ich habe rhino nicht verwendet, aber könnte man nicht einfach var verwenden?

d.h.

var foo = myObject.foo;
foo();

Bearbeiten: Verdammt, ich wusste, dass es einen Haken geben würde! Miles' Vorschlag wäre in diesem Fall die richtige Wahl.

0 Stimmen

Aha! Zu einfach für mich :) Danke!

0 Stimmen

Ah, warte... hier ist mein eigentliches Problem. Ich möchte das programmtechnisch machen. Ich kenne die Namen der Objekteigenschaften nicht wirklich vorher.

0 Stimmen

Diese Antwort ist leider nur ein Durcheinander, kann sie deshalb gelöscht werden? Nichts für ungut!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X