Как получить глобальную область видимости внутри функции определения?
Можете ли вы получить глобальную область при использовании строгого режима, а также убедиться, что вы можете работать в неоконной среде.
Смотрите эти примеры:
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
и все, но кто знает...:)
Что если вы сохранили ссылку на окно на другой универсально доступный объект, такой как 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
тогда это будет возвращено.
Я хотел бы видеть, придумал ли кто-нибудь более умный путь.