10

我试图了解 jQuery 是如何设置自己的。

一开始 jQuery 会自动调用一个函数,该函数会导出一个模块。

设置如何工作?

这里有一些更详细的子问题可能会回答更一般的问题:

  • 递归调用function(w)at 有什么用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 ) {
4

1 回答 1

18

递归调用function(w)at 有什么用module.exports

它不是递归调用,更像是延迟初始化函数。在一些 CommonJS 环境中,比如 Node.JS,全局对象没有document属性,而其他的比如 Browserify 和 Webpack 有。

jQuery 需要document属性来初始化,所以它首先检查全局对象是否包含document属性。如果是这样,它会立即初始化,使浏览器内的 CommonJS 环境愉快。如果没有,它会返回一个函数,该函数可用于稍后初始化 jQuery。稍后可以在假窗口上调用此函数,使用 jsdom 之类的东西创建。


noGlobal变量有什么用?

这里noGlobal使用变量。

来自 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;
}

本质上,如果noGlobalundefined,jQuery 会将自己添加到全局window对象中。唯一不会这样做的情况是,它是由 CommonJS 加载器加载的,它具有document全局对象上的属性,例如 Browserify 或 Webpack。下面的调用是 where noGlobalis not undefined

factory( global, true )

factory实际设置在哪里,它的类型是什么?

factory变量是 a ,它在function这里声明:

function( window, noGlobal ) {

它是传递给IIFE的第二个参数。


为什么factory参数可以用一个参数调用,也可以用两个参数调用?

因为 JavaScript。

在 JavaScript 中,不需要匹配声明函数的参数数量。任何省略的参数都有值undefined


global论证应该包含什么?(我希望有像 c++ 这样的类型......)

它应该包含 JavaScript 环境的全局对象。在浏览器中,这个对象被称为window,而在 Node 中,这个对象被称为global。在这两种环境中,this在全局范围内使用将解析为全局对象,无论它的全局名称是什么。

但是,由于某些 3rd-party 包装器可以更改 jQuery 初始化的范围,jQuery 将首先检查window对象是否可用,如果可用则使用它。如果不使用,它将默认使用this.

typeof window !== "undefined" ? window : this

还有一个问题: w 论点从何而来?

当全局对象不包含 adocument时,它返回一个接受一个参数的函数,即w. 这个对象将是一个类似window- 的对象,document它可以用 jsdom 之类的东西创建。

于 2015-05-11T03:44:12.723 回答