你可以在使用严格模式的同时获得全局作用域,并确保你可以在非窗口环境下运行
请看这些例子:
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.
});
是否有办法在define
内获得全局变量(window
/GLOBAL
)
var global = Function("return this")();
如果您无法访问Function
,那么也可以尝试
var Function = function(){}.constructor,
global = Function("return this")();
这可能有帮助,也可能没有帮助,但我确实提出了一种方法来覆盖需求模块的上下文,使用以下代码…
require.s.contexts._.execCb = function(name, callback, args) {
return callback.apply(/* your context here */, args);
};
再次,不确定这是否会帮助use strict
和所有,但谁知道…:)
到目前为止我所做的:
(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
,则会返回。
我想看看是否有人想出了一个更聪明的方法。
如果将窗口引用存储在另一个普遍可访问的对象(如object)上会怎样?原型或类似的东西?
这是我通常做的(它适用于浏览器,node.js和ringgojs -即使在严格模式下):
if (!global) var global = this;
define(['other', 'thing'], function() {
// use global
});
define(['other', 'thing'], function() {
"use strict";
// use global
});
阅读下面的StackOverflow线程了解更多细节:在JavaScript中定义全局对象的实现独立版本