3

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

Смотрите следующие примеры:

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://stackoverflow.com/questions/9031888/any-way-to-force-strict-mode-in-node) 
    // But that not the point. 
}); 

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

+0

Возможно, дубликат: http://stackoverflow.com/q/8280137/783743 –

ответ

8
var global = Function("return this")(); 

Если у вас нет доступа к Function, а затем попробовать

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

Они будут заблокированы, если мы используем CSP и не допустим небезопасного-eval.Например: 'Uncaught EvalError: отказывается оценивать строку как JavaScript, потому что« unsafe-eval »не является разрешенным источником сценария в следующей директиве политики безопасности контента:« script-src https: «self». ' – Serg

0

Что я пришел оп с до сих пор:

(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 
}); 

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

Хотелось бы узнать, придумал ли кто-нибудь более умный способ.

0

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

1

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

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

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

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

0

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

if (!global) var global = this; 

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

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

Прочитайте следующую StackOverflow нить для получения более подробной информации: Defining an implementation independent version of the global object in JavaScript

Смежные вопросы