我想在我的require模块中为window
和document
对象设置别名(用于速度目的和完整性检查)。
例如,我想写:
define([`jQuery`, `window`, `document`], function($, window, document, undefined) {
var element = document.getElementByClassName("test");
// more code here
});
传递window
和document
是JS模块中的常见做法(这里有很好的解释:http://toddmotto.com/what-function-window-document-undefined-iife-really-means/)。
如何将window
和document
传递到我的require模块?我可以在require.config.paths
对象中做些什么吗?
我似乎无法在网上找到任何告诉我如何操作的资源。
谢谢!
答案 0 :(得分:1)
您需要定义一个导出每个模块的模块 - window
,document
和undefined
。
因此,在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。
这是一个更好的压缩率的黑客攻击。如果undefined
是函数作用域中的变量而不是全局对象属性,则minifies可以将其减少为单个字母(从而实现更好的压缩率)。
但是,如果您仅使用缩小,则有效。如果你使用minification + gzip来提供你的生产脚本(就像你应该这样!),这种方法是无关紧要的。 Gzip使用LZ77算法,用引用替换重复出现的数据。所以它会抓住&压缩所有window
或document
或undefined
或任何其他相关事件,确保您安全。
在ES5 *之前,undefined
是没有写保护的全局对象的属性。所以它可能被覆盖,导致奇怪和意外的行为。
但是,使用ES5,全局属性undefined
,NaN
和Infinity
变为只读。因此,它在所有现代浏览器中得到普遍采用 - 当然除了IE 9之外 - 不再可能覆盖这些值。
另外,对于ES6,我们有Proxy。如果我们怀疑某人正在修改全局变量,您可以使用代理来调试(跟踪)任何属性访问或设置事件,并使用handler.get
或handler.set
陷阱。 Read more about Proxies here
答案 1 :(得分:0)
这是关于IIFE的非常好的文章。但我没有看到传递文档和窗口对象的任何意义,也没有看到任何好处。这些在您的项目中随处可用,无需通过。他拿窗户和文件只是为了说明。
如果我错了,请纠正我。打开纠正。