如何在定义函数中获得全局作用域



你可以在使用严格模式的同时获得全局作用域,并确保你可以在非窗口环境下运行

请看这些例子:

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和所有,但谁知道…:)

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

到目前为止我所做的:

(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中定义全局对象的实现独立版本

相关内容

  • 没有找到相关文章

最新更新