Как получить глобальную область видимости внутри функции определения?

Можете ли вы получить глобальную область при использовании строгого режима, а также убедиться, что вы можете работать в неоконной среде.

Смотрите эти примеры:

define(['other', 'thing'], function() {
    // this === window in desktop environment
    // this === GLOBAL in node environment
});
define(['other', 'thing'], function() {
    "use strict";
    // this === undefined in desktop environment
    // this === GLOBAL in node environment
    // As of my understanding node has to be configured using `node --use_strict`
    // (http://stackru.com/questions/9031888/any-way-to-force-strict-mode-in-node)
    // But that not the point.
});

Есть ли способ получить глобальную переменную (window/GLOBAL) внутри define,

5 ответов

Решение
var global = Function("return this")();

Если у вас нет доступа к Functionтогда тоже попробуй

var Function = function(){}.constructor,
    global = Function("return this")();

Это может или не может помочь, но я нашел способ переопределить контекст модулей requirejs, используя следующий код...

require.s.contexts._.execCb = function(name, callback, args) {
    return callback.apply(/* your context here */, args);
};

Опять же, не уверен, поможет ли это use strict и все, но кто знает...:)

https://gist.github.com/jcreamer898/5685754

Что если вы сохранили ссылку на окно на другой универсально доступный объект, такой как Object.prototype или что-то подобное?

Это то, что я обычно делаю (это работает для браузеров, node.js и RingoJS - даже в строгом режиме):

if (!global) var global = this;

define(['other', 'thing'], function() {
    // use global
});

define(['other', 'thing'], function() {
    "use strict";
    // use global
});

Прочитайте следующий поток Stackru для получения более подробной информации: Определение независимой от реализации версии глобального объекта в JavaScript

То, с чем я пришел до сих пор:

(function(root) { // Here root refers to global scope
    define('mything', ['other', 'thing'], function() {

    });
}(this);

Но тогда я не могу использовать r.js чтобы минимизировать мое приложение.

И еще можно проверить, что использовать:

define(['other', 'thing'], function() {
    var root = typeof GLOBAL != 'undefined' ? GLOBAL : window;
});

Еще один способ определить глобальный файл, который возвращает глобальный:

global.js:

define(function() {
    return typeof GLOBAL != 'undefined' ? GLOBAL : window;
});

mything.js

define(['global', 'other', 'thing'], function(root) {
    // root === window/GLOBAL
});

Но мне это не нравится, потому что, если будет введена глобальная переменная, это сломается, или если пользователь в среде браузера определит GLOBAL тогда это будет возвращено.

Я хотел бы видеть, придумал ли кто-нибудь более умный путь.

Другие вопросы по тегам