вторник, 16 июля 2013 г.

underscore.js осмотр

Это библиотека утилит, которая предлагает набор функций, характерных для функционального программирования.
Создает родную атмосферу дла руби-разработчиков в браузере.
Как агитируют на сайте underscore.js - это галстук для смокинга jQuery и поддтяжек Backbone.js. 


И так это:
- функциональный набор: map, sort, invoke...
- встренный шаблонизатор
- дип кволити тестинг тулс.

При этом любая функция, которая имеет браузерную реализацию, будет алисом именно на браузреную реализацию.

underscore.js состоит из следующих разделов:
1. Collection Functions(Arrays or Objects)
iterator == function(element, index, list)
_.each(list, iteraror, [context]) Alias:  forEach - приминить на жаждый функцию
_.map(list, iterator, [context]) Alias: collect - применить на каждый элемент функцию и вернуть измененную колекцию
_.reduce(list, iterator, memo/*init value*/, [context]) Aliases: inject, foldl - получает из коллекции результирующее значение, сумма элементов например
_.reduceRight(list, iterator, memo, [context]) Alias: foldr - тоже что и предыдущая, только справа на лево
_.find(list, iterator, [context]) Alias: detect - вернуть первый подошедший условию, элемент списка
_.filter(list, iterator, [context]) Alias: select - вернуть колекцию, но только с теми элементами, которые подошли условию
...

2. Array Functions(they also work with arguments)
...

3. Function (uh, ahem) Functions
_.bind(function, object, [*arguments]) - в первую очередь обеспечивает когда бы ф-я не была вызвана значение this всегда будет object, а также паршиал-функции из функционального програмирования, которая часто применяется в скале.
var func = function(greeting){ return greeting + ': ' + this.name };
func = _.bind(func, {name : 'moe'}, 'hi');
func();
=> 'hi: moe'
_.bindAll(object, *methodNames)  - делает обьекту его методы всегда привязанные к нему, то-есть если даже такой метод мы привяжем как обработчик на событие или будем его колить/еплаить, то this в это методе всегда будет этот обьект. Полезно для обработчиков событий:
var buttonView = {
  label   : 'underscore',
  onClick : function(){ alert('clicked: ' + this.label); },
  onHover : function(){ console.log('hovering: ' + this.label); }
};
_.bindAll(buttonView, 'onClick', 'onHover');
// When the button is clicked, this.label will have the correct value.
jQuery('#underscore_button').bind('click', buttonView.onClick);

_.partial(function, [*arguments]) - чистая паршиал-функция, в отличии от _.bind не переопределяет для нее контекст, а только заполняет частично аргументы.
var add = function(a, b) { return a + b; };
add5 = _.partial(add, 5);
add5(10);
=> 15

_.memoize(function, [hashFunction]) - кеширует значение фукнции и при повторном обращении к ней возвращает значение из кеша. Второй аргумент, необязательная функция, она создает хеш, по-уполчании хешом считается первый аргумент функции, все вызовы с одинаковым первым аргументом, вернут одинаковое значение
var fibonacci = _.memoize(function(n) {
  return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
});

_.delay(function, wait, [*arguments]) - вызвать функцию с задержкой в wait милисекунд
var log = _.bind(console.log, console);
_.delay(log, 1000, 'logged later');
=> 'logged later' // Appears after one second.

_.defer(function, [*arguments]) - аналог setTimeout 0, то есть нам нужно выполнит какой-то долгоиграющий участок кода, сразу после отработки текущего

_.throttle(function, wait, [options]) - дроссель, который навешивает время на функцию, с какой периодичностью она может быть вызвана, например это полезно, если мы можем среагировать на определенное событие не чаще какого-то интервала, поэтому нужно такие события игнорировать, когда у нас идет обработка.

_.debounce(function, wait, [immediate]) - вызывать функцию с указанной задержкой, если мы пытаемся вызывать ее до того как истечет интервал, все вызовы игнорятся

_.once(function) - вызовется один раз, а потом - кеш.

_.after(count, function)  - функция начнет вызываться, только после указанного количества обращений. Полезно когда мы запускаем несколько асинхронных запросов и все они подвязываются на один обработчик, этой функцией мы среагируем только после того, как все запросы вернут ответ.

_.wrap(function, wrapper) - обворачиваем функцию, обертака получает функцию первым аргументом.

_.compose(*functions) - связывает несколько функций, в пайп, когда возвращаемое значение последней передается в предпоследнюю, и так до первой.

4. Object functions
.....


5. Utility Functions
_.template(templateString, [data], [settings]) - возвращает функцию, которая ждет данные для подставки в скомпилированный шаблон. Шаблоны могут быть в ERB-виде, а также можно переключить под Mustache
....

6. Chaning
Позволяет обвернуть обьект/массив и потом в цепочке вызывать разные ф-и андерскора, чтобы получить значение из последней функции нужно на результате вызвать .value();



Комментариев нет:

Отправить комментарий