gpt4 book ai didi

javascript - JQuery 库模块导出

转载 作者:可可西里 更新时间:2023-11-01 02:57:12 25 4
gpt4 key购买 nike

我想了解 jQuery 是如何 self 设置的。

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

设置如何工作?

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

  • module.exports 中对function(w) 的递归调用有什么用?
  • noGlobal 变量有什么用?
  • 工厂实际设置在哪里,它的类型是什么?
  • 为什么 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 ) {

最佳答案

What is the use of the recursive call to function(w) at module.exports?

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

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


What is the use of the noGlobal variable?

这里使用了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;
}

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

factory( global, true )

Where is the factory actually set up and what is its type?

factory 变量是一个函数,声明如下:

function( window, noGlobal ) {

这是传递给 IIFE 的第二个参数.


Why can the factory argument get called with one argument and with two as well?

因为 JavaScript。

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


What is the global argument supposed to contain? (I wish there were a type like in c++...)

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

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

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

one more question: where is the w argument coming from?

当全局对象不包含文档时,它返回一个接受一个参数的函数,即w。该对象将是一个类似 window 的对象,带有一个可以使用类似 jsdom 的东西创建的 document

关于javascript - JQuery 库模块导出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30080464/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com