Javascript JQuery库模块导出
我试图理解jQuery是如何建立自己的 在一开始,jQuery自动调用一个函数,该函数导出一个模块 设置是如何工作的 下面是一些更详细的子问题,这些问题可能会回答更一般的问题:Javascript JQuery库模块导出,javascript,jquery,module,umd,Javascript,Jquery,Module,Umd,我试图理解jQuery是如何建立自己的 在一开始,jQuery自动调用一个函数,该函数导出一个模块 设置是如何工作的 下面是一些更详细的子问题,这些问题可能会回答更一般的问题: 在模块导出中递归调用函数(w)有什么用 noGlobal变量的用途是什么 工厂实际设置在哪里?工厂类型是什么 为什么可以用一个参数和两个参数调用工厂参数 global参数应该包含什么?(我希望有一个类似于C++的类型) 在模块导出中递归调用函数(w)有什么用 它不是递归调用,更像是延迟初始化函数。在一些常见的JS环
- 在
模块导出中递归调用
有什么用函数(w)
变量的用途是什么noGlobal
- 工厂实际设置在哪里?工厂类型是什么
- 为什么可以用一个参数和两个参数调用
参数工厂
参数应该包含什么?(我希望有一个类似于C++的类型)global
在
模块导出中递归调用函数(w)
有什么用
它不是递归调用,更像是延迟初始化函数。在一些常见的JS环境中,如Node.JS,全局对象没有文档
属性,而Browserify和Webpack等其他环境则有
jQuery需要初始化document
属性,因此它首先检查全局对象是否包含document
属性。如果确实如此,它会立即初始化,使浏览器中的CommonJS环境变得愉快。如果没有,则返回一个函数,该函数可用于以后初始化jQuery。这个函数稍后可以在一个假窗口上调用,用jsdom之类的东西创建
noGlobal
变量的用途是什么
此处使用noGlobal
变量
:
// Expose jQuery and $ identifiers, even in
// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( typeof noGlobal === strundefined ) {
window.jQuery = window.$ = jQuery;
}
本质上,如果noGlobal
是undefined
,jQuery将自己添加到全局窗口
对象中。它唯一不会这样做的是,如果它是由CommonJS加载程序加载的,并且全局对象上有文档
属性,例如Browserify或Webpack。下面的调用是noGlobal
未定义的地方
factory( global, true )
工厂实际设置在哪里?工厂类型是什么
工厂
变量是一个函数
,在此声明:
function( window, noGlobal ) {
这是第二个被传递到数据库中的参数
为什么可以用一个参数和两个参数调用工厂
参数
因为JavaScript
在JavaScript中,不需要匹配函数声明的参数数量。任何省略的参数都具有值未定义
factory( global, true )
global
参数应该包含什么?(我希望C++中有一个类似的类型)
它应该包含JavaScript环境的全局对象。在浏览器中,此对象称为窗口
,在节点中,此对象称为全局
。在这两种环境中,在全局范围中使用this
将解析为全局对象,不管它的全局名称是什么
但是,由于某些第三方包装器可以更改jQuery初始化的范围,jQuery将首先检查窗口是否可用,如果可用,则使用它。如果不使用,它将默认使用此
typeof window !== "undefined" ? window : this
还有一个问题:w论点来自哪里
如果全局对象不包含文档
,它将返回一个函数,该函数接受一个参数w
。这个对象将是一个类似于窗口的对象,它有一个文档
,可以用类似jsdom的东西创建。还有一个问题:w参数来自哪里?@初学者当全局对象不包含文档
时,它返回一个接受一个参数的函数,w
。此对象将是一个类似于窗口的对象,带有一个可以使用类似jsdom的东西创建的文档。这是否意味着w是一个全局变量,在没有可用文档的情况下可用?不完全是这样。当jQuery没有全局文档时,它将返回一个函数,该函数稍后可用于初始化jQuery。要做到这一点,您需要调用该函数,并传入要对其进行初始化的类似窗口的对象。类似窗口的对象是您必须创建的对象,当您想要初始化它时,必须使用类似jsdom和pass的东西。类似这样:var$=require('jquery')(myFakeWindow)
,其中myFakeWindow
是您创建的类似窗口的对象。好的,我知道了:w是正好在这个位置定义的函数的参数。这是一个自由变量,此时不需要定义,对吗?