2012-06-22 5 views
5

Per convenzione stile mi piace essere esplicito quando sto accedendo variabili in ambito globale, preferendoDevo usare l'auto o la finestra per fare riferimento all'ambito globale?

window.example = "Hello"; 
window.alert(window.example); 

al meno prolissa

example = "Hello"; 
alert(example); 

Ora ho un modulo che potrebbe essere utilizzato direttamente dal browser o, se disponibili, da un web worker. Nei web worker l'oggetto globale è chiamato self, mentre nel browser si chiama window.

L'oggetto window ha una proprietà di auto, in modo da self.example = "Hello" avrebbe funzionato in entrambi i contesti, a condizione che nessuno redeclares self (come fanno spesso: var self = this).

Qual è la migliore convenzione con cui andare?

  • Utilizzare self e sperare che nessuno dichiari uno self in conflitto.
  • Se è definito window, utilizzare window, altrimenti utilizzare self.
  • Qualcos'altro?

Avendo pensato a questo, sono propenso ad andare con il secondo.

risposta

6

In ambito globale, sia nella pagina o un lavoratore web, è possibile scrivere il codice in questo modo:

(function(global) { 
    // ... whatever 
}(this); 

Poi all'interno di quella funzione esterna principale si può usare "globale" (o chiamarlo "wi ndow "o" self "o" qualunque ") e funzionerà in entrambi i contesti (o in Node.js per quella materia).

1

mi piacerebbe suggerire

var global; try { global = window } catch(e) { global = self } 
+0

Sorprendentemente, questo sembra generare un errore di riferimento quando viene utilizzato nel web worker. Chrome dice: "ReferenceError: Can not find variable: window". Dovrei menzionare che sto usando requireJS per caricare questo modulo dal mio worker, quindi penso che potrebbe essere la fonte di qualche stranezza. – RichardTowers

+0

scuse, ho dimenticato la gestione dura di una variabile che non esiste. aggiustato. – matt3141

+0

'global = typeof window! ==" undefined "&& window! == null? window: self; anche sembra funzionare senza errori. Mi piace la risposta di @ Pointy però. – RichardTowers

0

è possibile creare il proprio riferimento a ciascuna finestra o autonomo:

var my_window = window || self; 
+0

Ma, in un webworker, il contesto globale non è una finestra, quindi chiamare il contesto globale 'my_window' sembra fuorviante. – jfriend00

+0

Lo sviluppatore è ovviamente libero di nominare le sue variabili come preferisce – jackwanders