Оновлення 2019
З усіма сучасними Webpacks і Broccolis, і Gulps and Grunts, і TypeScripts і AltScripts, а також create-response-apps тощо, це досить марно, але якщо ви просто працюєте з простими, старими, VanillaJS і хочете зробити це ізоморфно, це, мабуть, ваш найкращий варіант:
var global
try {
global = Function('return this')();
} catch(e) {
global = window;
}
Виклик конструктора функції працюватиме навіть при використанні --use_strict
у вузлі, оскільки конструктор функції завжди виконується в глобальній несуворій області.
Якщо конструктор функцій виходить з ладу, це тому, що ви знаходитесь у браузері, де eval
вимкнено заголовки CSP.
Звичайно, з Діно на шляху (заміна вузлів), вони можуть також заборонити конструктор Function, в цьому випадку він повернувся до перерахування об'єктів , таких як global
, module
, exports
, globalThis
і window
, а потім перевірка качка типу , яка є глобальним вичерпно ... : - /
Божевільне однорядкове рішення (оригінал):
var global = Function('return this')() || (42, eval)('this');
.
.
.
Працює
- в кожному середовищі (що я тестував)
- в суворому режимі
- і навіть у вкладеному масштабі
Оновлення 2014-вересня-23
Тепер це може не вдатися, якщо заголовки HTTP в останніх браузерах явно забороняють eval.
Обхідним шляхом було б спробувати / зловити оригінальне рішення, оскільки лише браузери, як відомо, запускають цей тип підмножини JavaScript.
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');