2016-05-09 7 views
1

global Referenz

Ich bin auf der Suche nach einer Möglichkeit, zu identifizieren oder zu definieren, wenn die „global“ zu prüfen (es gibt ein superglobales "Fenster" - und wenn nicht, es als solches zu erschaffen.JavaScript - wie die „global“ (Super-global) für plattformübergreifende Verwendung im Strict-Modus

Ich habe das vor ein paar Wochen in einem Code auf GitHub gesehen, aber jetzt, wo ich es brauche, kann ich es nirgends finden. Ich habe vielleicht übersehen, aber es war sehr kurz und alle intelligent wie auf 1 (kurze) Linie - ohne if, und ohne var (oder let) - im globalen Rahmen -> im strikten Modus.

Ich habe nach 2 Stunden gesucht, um das zu finden, und alles, was ich finden kann, ist unzählige Verweise auf "globale Variablen" - die in diesem Fall eindeutig keine "Variable" wie das super-globale "Fenster" (oder in NodeJS "global") ist nicht änderbar.

Die Lösung, die ich zur Zeit habe, ist nicht so toll, aber es funktioniert, Art-of:

"use strict"; 

if ('undefined' == typeof global) 
{ 
    Object.defineProperty 
    (
     window,'global', 
     { 
      writable:false, 
      configurable:false, 
      enumerable:false, 
      value:window 
     } 
    ); 
} 

Also, wenn Sie so etwas wie versuchen:

global = 'bite me!'; 

Dann wird das Verhalten als erwartet es wirft:

Uncaught TypeError: Cannot assign to read only property 'global' of...

Welches ist gut, - genau wie es sich verhalten sollte.

Ich bin nicht sicher, ob dies der richtige Weg, es zu definieren ist, denn wenn ich etwas tun:

console.log(global); 

Dann wird die Konsole so etwas wie dies zeigt:

Window {top: Window, ...

Das sagt mir, dass es nicht als "global", sondern als "Fenster" identifiziert wird; - was alles schön und gut ist ein "Rundschreiben"; Ich bin mir jedoch sicher, dass es einen besseren Weg dafür gibt.

Jede Eingabe wird sehr geschätzt, dank

+0

'window = Fenster || global || {einige: new_object} ' – adeneo

+0

@adeneo :: im Browser," Fenster "existiert bereits, so wird es nur" Fenster "in diesem Fall bleiben - und" global "wird nicht definiert werden; sondern es wird geworfen, weil "global" nicht definiert ist. Wenn Sie dies im "strict mode" tun, wird ein Fehler ausgegeben, wenn "window" nicht definiert ist, wie bei NodeJS;) – argon

+0

Nun, Sie können das globale nicht überschreiben, wenn es existiert, sollte es Sei es was es schon ist, oder? – adeneo

Antwort

0

ich nie gedacht, dass dies tatsächlich funktioniert; aber es tut!
Im globalen Bereich, nach use strict; Sie können dies einfach tun:

this.Main = this; 

Jetzt können Sie einfach anrufen und definieren Dinge auf Main wie bei window -oder global; und diese neuen Eigenschaften werden wie erwartet im globalen Bereich vorhanden sein.

Nachdem Sie die gewünschten Änderungen an diesem Objekt vorgenommen haben; rufen Sie einfach an:

Object.freeze(this.Main); // makes it immutable 


Wenn Sie das alles in einem Rutsch (ohne triftigen Grund auch immer) tun wollen, dies zu tun:

Object.freeze(this.Main=this); // it actually works! 
Verwandte Themen