2013-03-16 9 views
10

Ich weiß, es ist nicht zu empfehlen, das globale Objekt zu verwenden und die ganze Idee hinter der Verwendung von AMD ist die Verwendung des globalen Objekts zu vermeiden. Aber für einige Legacy-Codes muss ich einige Dinge im globalen Objekt definieren. Derzeit sieht der Code wie folgt aus:Zugriff auf globale Objekt bei Verwendung von requirejs

//example2.js 
define(function(){ 
    var globalObject = window; 
    globalObject.x = ... 
    globalObject.y = ... 
}); 

Es funktioniert, aber harte Kodierung des globalen Objekt window nicht sehr schön aussieht und ich bin gespannt, ob es möglich ist, es zu entfernen. Wenn define() nicht verwendet wurde, sah der Code wie folgt:

//example1.js 
x = ... 
y = ... 

Ich weiß, ich weiß, du diesen Code hassen, aber lassen Sie sich auf den Punkt: Wie kann die globale Variable innerhalb der define() in strukturierter Art und Weise zugegriffen werden Funktion in Requirejs? Ich wünsche, es so etwas wie ein versteckten letzten Parameter an die Funktion war, die die define() wie diese geführt wird:

//example3.js 
define(function(globalObject){ 
    globalObject.x = ... 
    globalObject.y = ... 
}); 

Oder noch einfacher: die this Variable in dieser Funktion auf das globale Objekt verweisen würden. Zum Beispiel:

//example4.js 
define(function(){ 
    this.x = ... 
    this.y = ... 
}); 

Hinweis: bin ich über diese letzten nicht sicher. Untersuchung der this Variable innerhalb der Funktion, die an require() übergeben wird, sagt, dass es gleich window ist, die die Antwort auf meine Frage sein kann, aber ich konnte keine Dokumentation finden, die den Kontext erwähnt, dass die übergebene Funktion ausgeführt wird. Vielleicht läuft es doch im Kontext der globalen Variablen?

Antwort

5

Wenn Sie nicht im Strict-Modus sind, können Sie dies tun:

(function() { 
    var global = this; 

    define(function(){ 
    global.x = ... 
    global.y = ... 
    }); 
})(); 

Die äußere anonyme Funktion, die wir sofort aufrufen wird ohne besondere spezielle this Wert aufgerufen, und so (da dies nicht der Fall ist im strikten Modus), empfängt das globale Objekt als this. (Im strikten Modus würde es stattdessen undefined erhalten.) Also greifen wir this in eine Variable (global) innerhalb der anonymen Funktion und verwenden sie von der Funktion, die Sie in übergeben (die sich darüber schließt).

+0

das ist eine gute Idee, aber ich frage mich immer noch, ob es einen Mechanismus von innerhalb der 'define()' Funktion gibt, die nicht meinen Code in eine sofortige Anruffunktion einbetten muss? – AlexStack

13

Ich empfehle Ihnen, ein Modul zu erstellen, das das Objekt window zurückgibt. Dies ist besonders nützlich für Unit-Testing-Zwecke (Mocking-Abhängigkeiten).

window.js

define(function(){ 
    return window; 
}); 

app.js

define(['window'], function(win) { 
    // Manipulate window properties 
    win.foo = 1; 
    console.log(win.foo);  
}); 
+0

Was ist also, wenn Sie das globale Objekt tatsächlich möchten, da in Ihrem Modul ein anderer Kontext ausgeführt werden soll? – gman

+0

Wenn ich dich richtig verstehe @gman ... sagen wir, unser Code ist in einem Iframe, aber wir brauchen das oberste globale Objekt. Wir können dies tun: '// Code in iframe definieren ([ 'Fenster'], Funktion (win) {var Topwin = win.top; // Fensters Manipulieren iframe Eigenschaften win.foo = 1; console.log (win.foo); // manipulieren oberen Fenstereigenschaften topWin.foo = 2; console.log (topWin.foo); }); ' –

+0

sorry, ich meinte ich nicht renne im Browser so das globale Objekt ist nicht "window" – gman

5

Eine Variation @ TJCrowder Antwort, die auch im strikten Modus funktioniert:

(function(global) { 
    define(function() { 

     global.a="this"; 
     global.b="that"; 

    }); 
})(this); 

von Aufruf der sofort aufgerufenen Funktion Mit dem Argument 'this' (das außerhalb einer Funktion den globalen Geltungsbereich hat) wird dann unabhängig vom globalen Geltungsbereich als Argument 'global' in das IIF übernommen.

Dadurch wird auch eine harte Codierung für das 'window'-Objekt vermieden, ein Vorteil, da dies in Nicht-Browser-Umgebungen nicht gilt.

+0

Wenn ich diesen Code in eine Datei lege und sie an Node übergebe, dann ist 'this' '{}', egal ob ich im strikten Modus bin oder nicht. – Louis

Verwandte Themen