2013-03-16 15 views
10

So che non è consigliabile utilizzare l'oggetto globale e l'intera idea dietro l'utilizzo di AMD è di evitare l'utilizzo dell'oggetto globale. Ma per qualche codice legacy, devo definire alcune cose nell'oggetto globale. Attualmente il codice è simile al seguente:accesso all'oggetto globale quando si utilizza requirejs

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

Funziona ma difficile codifica l'oggetto globale window non ha un aspetto molto bello e sono curioso di vedere se è possibile rimuoverlo. Quando define() non è stato utilizzato, il codice si presentava così:

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

Lo so, lo so che odi questo codice, ma cerchiamo di essere al punto: come può la variabile globale può accedere in modo strutturato all'interno del define() funzione in requirejs? Vorrei che ci fosse una sorta di nascosto ultimo parametro alla funzione che viene passata al define() in questo modo:

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

O ancora più semplice: la variabile this ricorda all'oggetto globale all'interno di quella funzione. Per esempio:

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

Nota: io non sono sicuro di questo ultimo. Indagare la variabile this all'interno della funzione passata a require() dice che è uguale a window che può essere la risposta alla mia domanda, ma non sono stato in grado di trovare alcuna documentazione che menzioni il contesto in cui la funzione passata è in esecuzione. Dopo tutto, forse sta funzionando nel contesto della variabile globale?

risposta

5

Se non siete in modalità rigorosa, si può fare questo:

(function() { 
    var global = this; 

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

La funzione anonima esterna che abbiamo subito invochiamo viene richiamato senza particolare valore speciale this, e così (dal momento che questo non è in modalità rigorosa), riceve l'oggetto globale come this. (In modalità strict, invece, riceverà undefined). Quindi prendiamo this in una variabile (global) all'interno della funzione anonima e usiamolo dalla funzione passata in define (che si chiude su di essa).

+0

questa è una buona idea, ma mi chiedo ancora se esiste un meccanismo all'interno della funzione 'define()' che non richiede l'incorporamento del mio codice in una funzione di chiamata immediata? – AlexStack

13

Ti suggerisco di creare un modulo che restituisca l'oggetto window. Questo è particolarmente utile per scopi di test unitari (dipendenze di derisione).

window.js

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

app.js

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

e se davvero volessi l'oggetto globale come vuoi che il tuo modulo esegua altri contesti? – gman

+0

Se ho capito correttamente @gman ... diciamo che il nostro codice è all'interno di un iframe ma abbiamo bisogno del primo oggetto globale. Siamo in grado di fare questo: '// codice all'interno di IFRAME define ([ 'finestra'], la funzione (vittoria) {var Topwin = win.top; // Manipolare la proprietà della finestra di iframe win.foo = 1; console.log (win.foo); // manipolare top proprietà della finestra topWin.foo = 2; console.log (topWin.foo); }); ' –

+0

dispiace, volevo dire io non corro nel browser in modo che l'oggetto globale non sia 'window' – gman

5

Una variante di @ TJCrowder risposta, che funziona anche in modalità rigorosa:

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

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

    }); 
})(this); 

By chiamando la funzione immediatamente richiamata con l'argomento 'this' (che al di fuori di una funzione è l'ambito globale), quindi qualunque sia l'ambito globale, viene passato nell'III come argomento 'globale'.

Questo evita anche l'hard-coding per l'oggetto 'finestra', un vantaggio poiché non si applica in ambienti senza browser.

+0

Se metto quel codice in un file e lo passo al nodo, 'questo' è '{}', anche se non sono in modalità rigorosa. – Louis

Problemi correlati