Приветствую. Изучаю javascript и пытаюсь понять как работает jQuery. Прошу поправить мои комментарии к релизу версии 1.12. (из-за поддержки старых IE) в случае неверного истолкования.
jQuery JavaScript Library v1.12.4
Обозначения в комментариях:
-"Количество вызовов" = количество вызовов в других местах исходника
-"..." = см. исходник
Код значительно урезан с соблюдением исходной последовательности и синтаксиса, крупные блоки оставленные в оригинале если непрокомментированы
Исходный код
Разбиваю на несколько сообщений, целиком не пропускает
// 1. Мгновенно вызываемая функция (IIFE)
(function( global, factory ){определение модуля}(модуль))
// 1.1. Определение модуля
if ( typeof module === "object" && typeof module.exports === "object" ) { //... }
// 1.2. Модуль
typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
"use strict";
// Количество вызовов: 9
var deletedIds = [];
// Без комментариев
var document = window.document;
var slice = deletedIds.slice;
var concat = deletedIds.concat;
var push = deletedIds.push;
var indexOf = deletedIds.indexOf;
// Class2type карта. Количество вызовов: 4
var class2type = {};
// Количество вызовов: 2
var toString = class2type.toString;
// Количество вызовов: 6. У Sizzle своя переменная hasOwn
var hasOwn = class2type.hasOwnProperty;
/* Объект с информацией об особенностях текущего браузера. Количество вызовов: 74. У Sizzle своя переменная support */
var support = {};
var
// Количество вызовов: 2
version = "1.12.4",
/* Основная функция. Функция-конструктор, создающая в памяти браузера копию (экземпляр)
базового объекта - объект jQuery. Количество вызовов: 744 */
jQuery = function( selector, context ){return new jQuery.fn.init( selector, context );},
// Количество вызовов: 2. У Sizzle своя переменная rtrim
rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
// Количество вызовов: 1
rmsPrefix = /^-ms-/,
rdashAlpha = /-([\da-z])/gi,
// Камелизация. Количество вызовов: 1
fcamelCase = function( all, letter ) { return letter.toUpperCase(); };
// Для освобождения памяти от дубликатов методов. Количество вызовов: 39
jQuery.fn = jQuery.prototype = { /* определение свойств экземпляра jQuery в свойстве prototype конструктора объекта jQuery */ };
// Количество вызовов: 30
jQuery.extend = jQuery.fn.extend = function() { /* функция extend() - реализация extends (JS), наследование */ };
jQuery.extend( { /* добавление следующих свойств в объект jQuery: expando, isReady, error, noop, isFunction, isArray, isWindow, isNumeric,
isEmptyObject, isPlainObject, type, globalEval, camelCase, nodeName, each, trim, makeArray, inArray, merge, grep, map, guid, proxy, now,
support */ } );
// Анализатор кода JSHint
/* jshint ignore: start */
if ( typeof Symbol === "function" ) {
jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ];
}
/* jshint ignore: end */
// Заполнение class2type карты
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } );
// Функция, определяющая является ли объект массивом. Количество вызовов: 3
function isArrayLike( obj ) { //... }
// Количество вызовов: 6, не включая Sizzle.js
var Sizzle = (function( window ) { /* Sizzle - кросс-браузерный движок селекторов */ })( window );
// Количество вызовов: 10
jQuery.find = Sizzle;
// Количество вызовов: 12
jQuery.expr = Sizzle.selectors;
// Количество вызовов: 0
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
// Количество вызовов: 3
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
// Количество вызовов: 2
jQuery.text = Sizzle.getText;
// Количество вызовов: 4
jQuery.isXMLDoc = Sizzle.isXML;
// Количество вызовов: 12
jQuery.contains = Sizzle.contains;
// Функция проверки dir()-проверка на наличие в результатах иных элементов, кроме DOM
Количество вызовов: 6. У Sizzle своя переменная dir
var dir = function( elem, dir, until ) { //... };
// Функция выбора потомков siblings(). Количество вызовов: 2
var siblings = function( n, elem ) { //... };
// Количество вызовов: 2
var rneedsContext = jQuery.expr.match.needsContext;
var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );
// Количество вызовов: 1
var risSimple = /^.[^:#\[\.,]*$/;
// Количество вызовов: 3
function winnow( elements, qualifier, not ) { /* функция-фильтр winnow() - реализация js-функции filter() */ }
// Количество вызовов: 4
jQuery.filter = function( expr, elems, not ) { /* метод .filter()-реализация js-функции filter() */ };
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: find, filter, not, is */ } );
// Главная ссылка на корневой jQuery(document). Количество вызовов: 3
var rootjQuery,
// Проверка HTML строк. Количество вызовов: 3
rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,
// Количество вызовов: 5
init = jQuery.fn.init = function( selector, context, root ) { /* функция init() */ };
// Придание функции init свойства prototype конструктора объекта jQuery для последующего создания экземпляра. Количество вызовов: 1
init.prototype = jQuery.fn;
// Инициализация главной ссылки
rootjQuery = jQuery( document );
// Количество вызовов: 1
var rparentsprev = /^(?:parents|prev(?:Until|All))/,
// Методы jQuery, гарантирующие создание уникального набора. Количество вызовов: 1
guaranteedUnique = {
children: true,
contents: true,
next: true,
prev: true
};
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: has, closest, index, add, addBack */ } );
// Функция выборки потомков sibling(). Количество вызовов: 2
function sibling( cur, dir ) { //... }
// Количество вызовов: 29
jQuery.each( { /* перебирающая функция jQuery.each() */ };
// Количество вызовов: 10
var rnotwhite = ( /\S+/g );
/* Функция преобразования строчно-отформатированных опций в объектно-отформатированные.
Количество вызовов: 1 */
function createOptions( options ) { //... }
// Количество вызовов: 5
jQuery.Callbacks = function( options ) { функция jQuery.Callbacks() }
jQuery.extend( { /* добавление следующих свойств в объект jQuery: Deferred, when(Deferred helper) */ } );
// Deferred, используемая в DOM, готовность. Количество вызовов: 4
var readyList;
// Количество вызовов: 0
jQuery.fn.ready = function( fn ) {
// Добавление функции обратного вызова
jQuery.ready.promise().done( fn );
return this;
};
jQuery.extend( { /* добавление следующих свойств в объект jQuery: readyWait, holdReady, ready */ } );
// Функция очистки для готовых событий DOM. Количество вызовов: 0
function detach() { //... }
// Обработчик готовых событий. Количество вызовов: 0
function completed() { //... }
// Количество вызовов: 2
jQuery.ready.promise = function( obj ) { /* jQuery.ready.promise() - метод самоочистки */ };
// Удаляем проверку готовности DOM даже если пользователь этого не делал
jQuery.ready.promise();
// Повторение свыше унаследованных свойств объекта вплоть до его собственных
var i;
for ( i in jQuery( support ) ) { break; }
support.ownFirst = i === "0";
/* Примечание: Большинство тестов поддержки определены в их соответствующих модулях. False до запуска теста. Количество вызовов: 2 */
support.inlineBlockNeedsLayout = false;
jQuery( function() { /* исполнение «как можно скорее» в случае если нужно установить body.style.zoom */ } );
( function() {
var div = document.createElement( "div" );
// Support: IE<9
support.deleteExpando = true;
try {
delete div.test;
} catch ( e ) {
support.deleteExpando = false;
}
// Null elements to avoid leaks in IE.
div = null;
} )();
// Проверка данных. Количество вызовов: 5
var acceptData = function( elem ) { //... };
// Количество вызовов: 1
var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
rmultiDash = /([A-Z])/g;
// Подготовка данных для метода .data(). Количество вызовов: 2
function dataAttr( elem, key, data ) { //... }
// Проверка объекта кэша на пустоту. Количество вызовов: 3
function isEmptyDataObject( obj ) { //... }
// Количество вызовов: 2
function internalData( elem, name, data, pvt ) { /* правила обработки данных */ }
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: data, removeData */ } );
jQuery.extend( { /* добавление следующих свойств в объект jQuery: queue, dequeue, _queueHooks */ } );
jQuery.fn.extend( { /* добавление следующих свойств в экземпляр jQuery: queue, dequeue, clearQueue, promise */ } );
( function() {
var shrinkWrapBlocksVal;
support.shrinkWrapBlocks = function() {
if ( shrinkWrapBlocksVal != null ) { return shrinkWrapBlocksVal; }
shrinkWrapBlocksVal = false;
var div, body, container;
body = document.getElementsByTagName( "body" )[ 0 ];
if ( !body || !body.style ) { return; }
div = document.createElement( "div" );
container = document.createElement( "div" );
container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;
left:-9999px";
body.appendChild( container ).appendChild( div );
if ( typeof div.style.zoom !== "undefined" ) {
div.style.cssText =
"-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" +
"box-sizing:content-box;display:block;margin:0;border:0;" +
"padding:1px;width:1px;zoom:1";
div.appendChild( document.createElement( "div" ) ).style.width = "5px";
shrinkWrapBlocksVal = div.offsetWidth !== 3;
}
body.removeChild( container );
return shrinkWrapBlocksVal;
};
} )();