如何将窗口和文档对象传递到require模块?

时间:2015-08-21 02:07:01

标签: javascript requirejs

我想在我的require模块中为windowdocument对象设置别名(用于速度目的和完整性检查)。

例如,我想写:

define([`jQuery`, `window`, `document`], function($, window, document, undefined) {
    var element = document.getElementByClassName("test");
    // more code here
});

传递windowdocument是JS模块中的常见做法(这里有很好的解释:http://toddmotto.com/what-function-window-document-undefined-iife-really-means/)。

如何将windowdocument传递到我的require模块?我可以在require.config.paths对象中做些什么吗?

我似乎无法在网上找到任何告诉我如何操作的资源。

谢谢!

2 个答案:

答案 0 :(得分:1)

您需要定义一个导出每个模块的模块 - windowdocumentundefined

因此,在window.js文件中,您可以:

define(function(){
    // that's the actual `window` global object
    return window;
});

然后,你引用它,就像你对任何其他模块一样:

define(['jQuery', 'window'], function($, window) {
    // ...
});

同样覆盖你需要的所有其他人。

但是,我不建议您继续使用此方法。有2 general reasons why this approach was valuable

  1. 这是一个更好的压缩率的黑客攻击。如果undefined是函数作用域中的变量而不是全局对象属性,则minifies可以将其减少为单个字母(从而实现更好的压缩率)。

    但是,如果您仅使用缩小,则有效。如果你使用minification + gzip来提供你的生产脚本(就像你应该这样!),这种方法是无关紧要的。 Gzip使用LZ77算法,用引用替换重复出现的数据。所以它会抓住&压缩所有windowdocumentundefined或任何其他相关事件,确保您安全。

  2. 在ES5 *之前,undefined是没有写保护的全局对象的属性。所以它可能被覆盖,导致奇怪和意外的行为。

    但是,使用ES5,全局属性undefinedNaNInfinity变为只读。因此,它在所有现代浏览器中得到普遍采用 - 当然除了IE 9之外 - 不再可能覆盖这些值。

    另外,对于ES6,我们有Proxy。如果我们怀疑某人正在修改全局变量,您可以使用代理来调试(跟踪)任何属性访问或设置事件,并使用handler.gethandler.set陷阱。 Read more about Proxies here

答案 1 :(得分:0)

这是关于IIFE的非常好的文章。但我没有看到传递文档和窗口对象的任何意义,也没有看到任何好处。这些在您的项目中随处可用,无需通过。他拿窗户和文件只是为了说明。

如果我错了,请纠正我。打开纠正。