Подскажите по ООП
Разбирал скрипт, не понял как он работает.
Такой код: ( function(root, factory) { // Проверяет переменные, откуда эти переменные тут взялись? /* CommonJS */ if (typeof exports == 'object') module.exports = factory() /* AMD module */ else if (typeof define == 'function' && define.amd) define(factory) /* Browser global */ else root.Spinner = factory() } (this, function() { // Тут основной код // ....... // Тут еще идет функция, которая вызывается /** The constructor */ function Spinner(o) { if (typeof this == 'undefined') return new Spinner(o) this.opts = merge(o || {}, Spinner.defaults, defaults) } }) ) // Далее инициализируется это все следующим кодом: var spinner = new Spinner(opts).spin(target); Круглые скобки означают выполнить функцию: function(root, factory) Но не понятно откуда у этой функции появляются переменные: root, factory, exports и прочие? Далее идет (this, function() {}) подскажите, что это означает? Вызов безымянной функции, а что такое this в данном случае? Подскажите, пожалуйста как это работает? Заранее благодарю! |
Javascript же:
( function(root, factory) { // Проверяет переменные, откуда эти переменные тут взялись? /* CommonJS */ if (typeof exports == 'object') module.exports = factory() /* AMD module */ else if (typeof define == 'function' && define.amd) define(factory) /* Browser global */ else root.Spinner = factory() } (this, function() { // Тут основной код // ....... // Тут еще идет функция, которая вызывается /** The constructor */ function Spinner(o) { if (typeof this == 'undefined') return new Spinner(o) this.opts = merge(o || {}, Spinner.defaults, defaults) } }) )~ function temp(root, factory) { // Проверяет переменные, откуда эти переменные тут взялись? /* CommonJS */ if (typeof exports == 'object') module.exports = factory() /* AMD module */ else if (typeof define == 'function' && define.amd) define(factory) /* Browser global */ else root.Spinner = factory() } temp(this, function() { // Тут основной код // ....... // Тут еще идет функция, которая вызывается /** The constructor */ function Spinner(o) { if (typeof this == 'undefined') return new Spinner(o) this.opts = merge(o || {}, Spinner.defaults, defaults) } })~ function temp(root, factory) { // Проверяет переменные, откуда эти переменные тут взялись? /* CommonJS */ if (typeof exports == 'object') module.exports = factory() /* AMD module */ else if (typeof define == 'function' && define.amd) define(factory) /* Browser global */ else root.Spinner = factory() } var temp1 = this; var temp2 = function() { // Тут основной код // ....... // Тут еще идет функция, которая вызывается /** The constructor */ function Spinner(o) { if (typeof this == 'undefined') return new Spinner(o) this.opts = merge(o || {}, Spinner.defaults, defaults) } } temp( temp1, temp2) Если вызов происходит в глобальном контексте, то в обычном режиме this === window, в strict: this === undefined. |
function(root, factory) { … }Это определение анонимной функции-выражения (для этого всё обрамлено в обычные круглые скобочки). Дальше идёт (this, function() { … }это вызов этой функции. this по-умолчанию ссылается на глобальный объект, т.к. window. exports — глобальная переменная, оговоренная в стандарте CommonJS. Она необходима для экспорта функций из модулей (AMD тоже нужен для модулей). root и factory — это аргументы, передающиеся при вызове. root'ом будет this, а factory — функция. По сути эта анонимная функция нужна для поддержки экспорта функциональности модуля в различных API модулей. |
Благодарю! Все понял!
А где почитать чтоб понять про это: Цитата:
|
Если не боитесь английского и бесконечного полотна текста, то Writing Modular JavaScript With AMD, CommonJS & ES Harmony — большая и подробная статья о модульном JS.
Если лень читать кучу текста, то можно поковыряться в их вики. Если с английским плохо, то я ничего посоветовать не могу, сходу нагуглить материал на великом и могучем не удалось. |
Бармалей, премного благодарен!
|
Часовой пояс GMT +3, время: 01:35. |