Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何将窗口和文档对象传递到require模块?_Javascript_Requirejs - Fatal编程技术网

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

Javascript 如何将窗口和文档对象传递到require模块?,javascript,requirejs,Javascript,Requirejs,我想在我的require模块中为窗口和文档对象添加别名(用于速度和健全性检查) 例如,我想写: define([`jQuery`, `window`, `document`], function($, window, document, undefined) { var element = document.getElementByClassName("test"); // more code here }); 传入窗口和文档是JS模块中常见的良好实践(这里有很好的解释:) 如

我想在我的require模块中为
窗口
文档
对象添加别名(用于速度和健全性检查)

例如,我想写:

define([`jQuery`, `window`, `document`], function($, window, document, undefined) {
    var element = document.getElementByClassName("test");
    // more code here
});
传入
窗口
文档
是JS模块中常见的良好实践(这里有很好的解释:)

如何将
窗口
文档
传递到所需模块?在我的
require.config.path
对象中有什么我可以做的吗

我似乎在网上找不到任何能告诉我怎么做的资源


谢谢

这是一篇关于生活的非常好的文章。但我没有看到传递文档和窗口对象的任何意义,也没有看到任何好处。这些在你的项目中随处可见,不需要通过。他拿了一些窗户和文件,只是为了举例说明


如果我错了,请纠正我。打开以进行更正。

您需要定义一个模块来导出它们中的每一个-
窗口
文档
未定义

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

define(function(){
    // that's the actual `window` global object
    return window;
});
然后,您引用它,就像您对任何其他模块所做的那样:

define(['jQuery', 'window'], function($, window) {
    // ...
});
做同样的事情来涵盖你需要的所有其他事情

但是,我不建议您继续应用此方法。有

  • 这是一个更好的压缩率黑客。如果
    undefined
    是函数范围中的一个变量,而不是全局对象属性,minifies可以将其减少为一个字母(从而获得更好的压缩率)

    但是,如果仅使用缩小,则该选项有效。如果您使用minification+gzip服务于您的生产脚本(就像您应该做的那样!),那么这种方法是不相关的。Gzip使用LZ77算法,用引用替换重复出现的数据。因此,它将捕获并压缩所有
    窗口
    文档
    未定义
    或任何其他相关事件,这样您就安全了

  • 在ES5*之前,
    undefined
    是不带写保护的全局对象的属性。因此,它可能被覆盖,导致奇怪和意外的行为

    但是,对于ES5,全局属性
    undefined
    NaN
    Infinity
    变为只读。因此,随着它在所有现代浏览器中的普遍采用——当然,IE9除外——覆盖这些值已不再可能

    另外,通过ES6,我们有了更好的解决方案。如果我们暂停某人正在修改全局变量,您可以使用代理调试(跟踪)任何和每个属性访问或设置事件,并使用
    handler.get
    handler.set
    陷阱


  • 第一个好处是速度。如果我可以使用window的本地副本,那么当我编写
    If(typeof x==“undefined”)
    时,我可以对照本地window对象的undefined属性检查
    x
    的类型,而不是遍历DOM树以到达全局窗口。另一个原因是出于安全考虑。返回
    if(typeof x==“undefined”)
    示例:由于窗口对象是可变的,其他代码可以更改窗口的undefined属性的值。如果发生这种情况,
    typeof x
    将不等于undefined-->而是等于其他代码设置的值。这可能会导致代码中出现错误。但这并不能回答问题。