Update 2019
Mit all den heutigen Webpacks und Broccolis, Gulps und Grunts, TypeScripts und AltScripts sowie Create-React-Apps usw. ist dies ziemlich nutzlos, aber wenn Sie nur mit einfachem, altem VanillaJS arbeiten und machen möchten es ist isomorph, dies ist wahrscheinlich Ihre beste Option:
var global
try {
global = Function('return this')();
} catch(e) {
global = window;
}
Der Funktionskonstruktoraufruf funktioniert auch bei Verwendung --use_strict
im Knoten, da der Funktionskonstruktor immer in einem globalen, nicht strengen Bereich ausgeführt wird.
Wenn der Funktionskonstruktor fehlschlägt, liegt dies daran, dass Sie sich in einem Browser befinden, dessen eval
CSP-Header deaktiviert sind.
Natürlich mit Deno auf dem Weg (der Knoten Ersatz), können sie auch die Funktion Konstruktor nicht zulassen, wobei in diesem Fall ist es an der Rückseite Aufzählen Objekte wie global
, module
, exports
, globalThis
und window
, und dann die Ente-Typprüfung abschließend die globalen ist ... : - /
Verrückte einzeilige Lösung (Original):
var global = Function('return this')() || (42, eval)('this');
.
.
.
Funktioniert
- in jeder Umgebung (die ich getestet habe)
- im strengen Modus
- und sogar in einem verschachtelten Bereich
Update 2014-Sept-23
Dies kann jetzt fehlschlagen, wenn HTTP-Header in den neuesten Browsern die Auswertung ausdrücklich verbieten.
Eine Problemumgehung wäre, die ursprüngliche Lösung zu versuchen / zu fangen, da nur Browser bekannt sind, die diese Art von Teilmenge von JavaScript ausführen.
var global;
try {
global = Function('return this')() || (42, eval)('this');
} catch(e) {
global = window;
}
Example:
---
(function () {
var global = Function('return this')() || (42, eval)('this');
console.log(global);
(function () {
"use strict";
var global = Function('return this')() || (42, eval)('this');
console.log(global);
}());
(function () {
var global = Function('return this')() || (42, eval)('this');
console.log(global);
}).call('someNewContext');
}());
Tested:
---
* Chrome v12
* Node.JS v0.4.9
* Firefox v5
* MSIE 8
Why:
---
In short: it's some weird quirk. See the comments below (or the post above)
In `strict mode` `this` is never the global, but also in `strict mode` `eval` operates in a separate context in which `this` *is* always the global.
In non-strict mode `this` is the current context. If there is no current context, it assumes the global. An anonymous function has no context and hence in non-strict mode assumes the global.
Sub Rant:
There's a silly misfeature of JavaScript that 99.9% of the time just confuses people called the 'comma operator'.
var a = 0, b = 1;
a = 0, 1;
(a = 0), 1;
a = (0, 1);
a = (42, eval);
a('this');