我试图了解jQuery如何设置自己。
在开始时,jQuery会自动调用一个导出模块的函数。
设置如何运作?
这里有一些更详细的子问题可能会回答更一般的问题:
function(w)
对module.exports
的递归调用有什么用?noGlobal
变量的用途是什么?factory
实际设置在哪里?它的类型是什么?factory
参数可以用一个参数和两个参数调用?global
参数应该包含什么? (我希望有类似c ++的类型......)(function( global, factory ) {
if ( typeof module === "object" && typeof module.exports === "object" ) {
// For CommonJS and CommonJS-like environments where a proper `window`
// is present, execute the factory and get jQuery.
// For environments that do not have a `window` with a `document`
// (such as Node.js), expose a factory as module.exports.
// This accentuates the need for the creation of a real `window`.
// e.g. var jQuery = require("jquery")(window);
// See ticket #14549 for more info.
module.exports = global.document ?
factory( global, true ) :
function( w ) {
if ( !w.document ) {
throw new Error( "jQuery requires a window with a document" );
}
return factory( w );
};
} else {
factory( global );
}
// Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
答案 0 :(得分:16)
function(w)
对module.exports
的递归调用有什么用?
它不是递归调用,更像是延迟初始化函数。在某些CommonJS环境中,如Node.JS,全局对象没有document
属性,而其他如Browserify和Webpack则属于。{/ p>
jQuery需要document
属性进行初始化,因此首先检查全局对象是否包含document
属性。如果是这样,它会立即初始化,使浏览器中的CommonJS环境变得愉快。如果没有,则返回一个可用于稍后初始化jQuery的函数。稍后可以在假窗口上调用此函数,使用jsdom等创建。
noGlobal
变量的用途是什么?
此处使用noGlobal
变量。
<强> Excerpt from jQuery 强>
// 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会将自己添加到全局window
对象中。唯一不会这样做的是它是由CommonJS加载器加载的,在全局对象上有document
属性,例如Browserify或Webpack。以下调用是noGlobal
不是undefined
的地方。
factory( global, true )
factory
实际设置在哪里?它的类型是什么?
factory
变量是function
,在此处声明:
function( window, noGlobal ) {
这是传递给IIFE的第二个参数。
为什么
factory
参数可以用一个参数和两个参数调用?
因为JavaScript。
在JavaScript中,不需要匹配声明函数的参数个数。任何省略的参数都具有值undefined
。
global
参数应该包含什么? (我希望有类似c ++的类型......)
它应该包含JavaScript环境的全局对象。在浏览器中,此对象称为window
,在Node中,此对象称为global
。在这两种环境中,在全局范围内使用this
将解析为全局对象,无论它的全局名称是什么。
但是,由于某些第三方包装器可以更改jQuery初始化的范围,jQuery将首先检查window
对象是否可用并使用它(如果可用)。如果不使用,则默认使用this
。
typeof window !== "undefined" ? window : this
还有一个问题:w论证来自何处?
当全局对象不包含document
时,它返回一个接受一个参数w
的函数。这个对象是一个类似window
的对象,其document
可以用jsdom之类的东西创建。