Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/390.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/AMD模块中传递jquery引用是可选的?_Javascript_Jquery_Requirejs_Amd - Fatal编程技术网

Javascript 为什么在require/AMD模块中传递jquery引用是可选的?

Javascript 为什么在require/AMD模块中传递jquery引用是可选的?,javascript,jquery,requirejs,amd,Javascript,Jquery,Requirejs,Amd,为什么在requirejs模块中传递对jQuery的引用是可选的?例如,考虑下面的代码,不同版本的拳头线 define(['jquery'],function ($) { var initialize=function(){ console.log($.fn.jquery); }; return { initialize: initialize }; }); 对于这一行,您希望console.log能够正常工作 define

为什么在requirejs模块中传递对jQuery的引用是可选的?例如,考虑下面的代码,不同版本的拳头线

define(['jquery'],function ($) {

    var initialize=function(){
        console.log($.fn.jquery);
    };

    return {
        initialize: initialize
    };

});
对于这一行,您希望console.log能够正常工作

define(['jquery'],function ($) { ...
“jquery”被加载并传递到后面的代码中,其中$作为引用

对于这一行,您可能希望console.log失败

define(function () { ...
但是为什么这一行可以工作呢?即为什么console.log知道$是什么

define(['jquery'],function () {
现在我想你会说。。。因为您正在使用全局引用来查询$,但这不是有点。。。不安全的?如果$在全球范围内可用,为什么您仍然需要['jquery']依赖项呢?如果您正在做这样的事情呢

define(['jquery','classA','classB] ...
如果你继续

define(['jquery','classA','classB],function(ClassA,ClassB){
那么您不需要包含$reference,否则它会认为ClassA引用了['jquery']依赖项吗

那么,为什么它是可选的,更重要的是,哪一个是最佳实践

//编辑

抱歉,我的意思是添加配置详细信息

require.config({


}))

不应将其视为“可选”。始终将AMD模块的结果绑定到参数

在这种情况下,当通过AMD加载时,jQuery没有调用
noConflict
,因此它仍然会关闭
窗口。$
。这就是为什么即使它没有绑定到
$
参数,它也会“工作”的原因

据推测,AMD垫片(或模块)将根据以下注释中的措辞调用
noConflict

一致地将jQuery(或任何其他模块,包括不返回有用值的jQuery插件)绑定到参数。这将避免定义列表中的混乱和不匹配。(使用多个版本的jQuery有潜在危险。)


就我个人而言,我通过
加载jQuery并将其填充到AMD模块中,因为我喜欢这个控件。我还手动调用
noConflict
,因此需要通过绑定为参数的
$
来访问它。

尽管jQuery将自己定义为AMD模块,但它也将其
jQuery
$
导出到全局命名空间(如果他们愿意,每个模块都可以做到,但没有人做到,因为这与模块化正好相反)。我不知道有什么好处,但他们似乎认为这将有助于使用混合AMD/globals代码的开发人员

下面是jQuery这种行为的一个很好的解释:

paths: {
    "jquery": "//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min"
}
// Do this after creating the global so that if an AMD module wants to call
// noConflict to hide this version of jQuery, it will work.