Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.05.2013, 12:28
Аспирант
Отправить личное сообщение для Petja Посмотреть профиль Найти все сообщения от Petja
 
Регистрация: 13.03.2011
Сообщений: 57

Подскажите по ООП
Разбирал скрипт, не понял как он работает.

Такой код:
(
    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 в данном случае?

Подскажите, пожалуйста как это работает? Заранее благодарю!
Ответить с цитированием
  #2 (permalink)  
Старый 18.05.2013, 12:55
Аватар для Aetae
Любитель
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 5,417

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.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 18.05.2013, 12:59
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

function(root, factory) { … }
Это определение анонимной функции-выражения (для этого всё обрамлено в обычные круглые скобочки).
Дальше идёт
(this, function() { … }
это вызов этой функции. this по-умолчанию ссылается на глобальный объект, т.к. window.

exports — глобальная переменная, оговоренная в стандарте CommonJS. Она необходима для экспорта функций из модулей (AMD тоже нужен для модулей).
root и factory — это аргументы, передающиеся при вызове. root'ом будет this, а factory — функция.

По сути эта анонимная функция нужна для поддержки экспорта функциональности модуля в различных API модулей.
Ответить с цитированием
  #4 (permalink)  
Старый 18.05.2013, 15:21
Аспирант
Отправить личное сообщение для Petja Посмотреть профиль Найти все сообщения от Petja
 
Регистрация: 13.03.2011
Сообщений: 57

Благодарю! Все понял!
А где почитать чтоб понять про это:
Цитата:
exports — глобальная переменная, оговоренная в стандарте CommonJS. Она необходима для экспорта функций из модулей (AMD тоже нужен для модулей).
Ответить с цитированием
  #5 (permalink)  
Старый 18.05.2013, 15:38
Аватар для B@rmaley.e><e
⊞ Развернуть
Отправить личное сообщение для B@rmaley.e><e Посмотреть профиль Найти все сообщения от B@rmaley.e><e
 
Регистрация: 11.01.2010
Сообщений: 1,810

Если не боитесь английского и бесконечного полотна текста, то Writing Modular JavaScript With AMD, CommonJS & ES Harmony — большая и подробная статья о модульном JS.
Если лень читать кучу текста, то можно поковыряться в их вики.
Если с английским плохо, то я ничего посоветовать не могу, сходу нагуглить материал на великом и могучем не удалось.
Ответить с цитированием
  #6 (permalink)  
Старый 18.05.2013, 17:17
Аспирант
Отправить личное сообщение для Petja Посмотреть профиль Найти все сообщения от Petja
 
Регистрация: 13.03.2011
Сообщений: 57

Бармалей, премного благодарен!
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книжко по ООП krasovsky Учебные материалы 2 03.04.2013 11:50
var или function при ООП? artnik Общие вопросы Javascript 3 14.03.2012 14:48
Подскажите, где ошибка? Вып. меню allasan Элементы интерфейса 2 12.03.2012 23:36
Есть ли смысл использовать ООП. Duda.Ml1986@gmail.com Оффтопик 18 18.02.2012 19:47
подскажите, как сделать индикатор «до начала загрузки страницы»? SergAG Элементы интерфейса 7 31.05.2011 18:53