2015-05-06 4 views
7

Я пытаюсь понять, как настраивается jQuery.Модуль библиотеки библиотеки 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) { 

ответ

15

Что такое использование рекурсивного вызова function(w) в module.exports?

Это не рекурсивный вызов, скорее функция отсроченной инициализации. В некоторых средах CommonJS, таких как Node.JS, глобальный объект не имеет свойства document, в то время как другие, такие как Browserify и Webpack.

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, а в узле этот объект известен как global. В обеих средах использование this в глобальной области действия разрешит глобальный объект, независимо от его глобального имени.

Однако из-за некоторых сторонних оберток, которые могут изменить область, в которой инициализируется jQuery, jQuery сначала проверит, доступен ли объект window и использует его, если он есть. Если не использовать, по умолчанию будет использоваться this.

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

еще один вопрос: где ш аргумент приходит?

Когда глобальный объект не содержит document, она возвращает функцию, которая принимает один аргумент, w. Этот объект будет window-подобным объектом с document, который может быть создан с помощью чего-то вроде jsdom.

+0

еще один вопрос: откуда взялся аргумент w? – Beginner

+0

@Beginner Когда глобальный объект не содержит 'document', он возвращает функцию, которая принимает один аргумент' w'. Этот объект будет «оконным» объектом с «документом», который может быть создан с помощью чего-то вроде jsdom. –

+0

Означает ли это, что w - глобальная переменная, доступная в случае отсутствия документа? – Beginner

Смежные вопросы