2013-07-24 11 views
1

Этот код существует в библиотеке swipe.js. Я пытаюсь настроить его. Комментарий, предшествующий возврату, говорит, что «предоставляет Swipe API», но я не уверен, что это значит.Что возвращает эта функция swipe.js?

function Swipe(container, options) { 

... 

//everything that makes the library work, including a setup() function 

... 


    //expose the Swipe API 
    return { 
    setup: function() { 

     setup(); 

    }, 
    slide: function(to, speed) { 

     // cancel slideshow 
     stop(); 

     slide(to, speed); 

    }, 
    prev: function() { 

     // cancel slideshow 
     stop(); 

     prev(); 

    }, 
    next: function() { 

     // cancel slideshow 
     stop(); 

     next(); 

    },...some more stuff 
} 

Является ли возвращаемое значение массивом? Список массивов? Скажем, например, я создаю новый объект для прокрутки window['aNewSwipeObject'] = Swipe($theDOMElement);, и я вызываю функцию настройки следующим образом: window['aNewSwipeObject'].setup(), что вызвала setup()? Настройка() над возвратом или установка() внутри анонимной функции, которая находится в возврате функции Swipe()?

+1

Объект буквальным! – adeneo

ответ

1

Это возвращение объекта, где каждое свойство является ссылкой на анонимную функцию.

Это удобный способ инкапсуляции/скрытия данных. Частные функции существуют в функции Swipe (вы можете встраивать функции в JavaScript), а отдельные свойства для возвращаемого объектно-литерала - это просто ссылки на анонимные функции, которые называют эти частные функции.

Таким образом, только функция Swipe имеет доступ к этим частным внутренним функциям.

При вызове setup на объекте, он вызывает публичную функцию (на который ссылается setup свойства объекта), который, в свою очередь, вызывает функцию внутреннегоsetup(), которая доступна только в пределах функции Swipe.

Вот то, что делает он рассеялся:

function myAPI(options) { 

    function privateFunction1() { 
     ... 
    } 

    function privateFunction2() { 
     ... 
    } 

    function privateFunction3() { 
     ... 
    } 

    return { 
     publicFunction1: privateFunction1, 
     publicFunction2: function() { 
      //some extra code 
      privateFunction2(); 
     }, 
     publicFunction3: function() { 
      ... 
     } 
    }; 
} 

Теперь вы можете получить отдельные экземпляры, выполнив:

var myAPIObject = myAPI(options); 

Но другой шаблон, который вы видите:

var myAPI = (function() { 

    function privateFunction1() { 
     ... 
    } 

    function privateFunction2() { 
     ... 
    } 

    function privateFunction3() { 
     ... 
    } 

    return { 
     init: function(options) { 
      //do something with options 
     }, 
     publicFunction1: privateFunction1, 
     publicFunction2: function() { 
      //some extra code 
      privateFunction2(); 
     }, 
     publicFunction3: function() { 
      ... 
     } 
    }; 
})(); 

В этом случае вы выполните команду myAPI.init(options) для инициализации API, но в этом шаблоне myAPI - это синглтон (обычно это то, что вы хотите, если вы не хотите поддерживать состояние на основе каждого экземпляра).

+0

По singleton вы имеете в виду, что будет только один экземпляр этого объекта? Если в первом примере мы можем создать несколько объектов? – smilebomb

+0

@jefffabiny Да. В первом примере вы можете иметь несколько экземпляров, но во втором примере у вас есть синглтон. –

1

возвращает методы поэтому объект может использовать их

3

Возвращает объект буквально. Каждая клавиша в объекте является функцией.

Это часто используется для создания пространства имен функций и путем размещения их в области функций функции будут совместно использовать локальную область, унаследованную из пространства имен.

Например,

var Namespace = (function() { 
    var helperFunction = function() { ... } 
    var localData = // ... 

    return { 
     publicFunction1 : function() { ... }, 
     publicFunction2 : function() { ... }, 
     publicFunction3 : function() { ... } 
    } 

})(); 
+0

Итак, если я вызываю setup() на объекте, ссылается ли он на литерал объекта или на функцию setup(), определенную над ним? – smilebomb

+0

Чтобы быть точным, он возвращает объект. Линейный объект * - это просто синтаксическая конструкция для создания объекта. –

+0

Если есть две функции setup(), и одна из них находится в операторе 'return {...}', а другая выше, она определяется как 'var setup = function() {...}', затем * last * функция является локальной функцией и не отображается в Swipe API. Таким образом, вы вызываете функцию 'setup' в' return {...} '. – ktm5124

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