Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Function.prototype.delayed = function (delay) {
var timer = 0;
var callback = this;
return function() {
clearTimeout(timer);
timer = setTimeout(callback, ms);
};
};
document.getElementById('search').addEventListener('keyup',search.delayed(200));
Так вот: лаконичность, достигаемая языком, никого не интересует.
А для того, чтобы доказать, что ваши архитектурные решения лучше — надо было не полениться и переписать все на javascript.
Просто потому что исходную задачу требовалось решить, не меняя языка решения.
bower install нужных вам библиотек, не беспокоясь о том, JS они или Coffee, и всё просто работает.И сахарность отнюдь не означает то же самое после компиляции в JavaScript.
for (item in arr) {
foo = item;
}
arr.forEach( function(index, item) {
foo = item;
});
for item in arr
foo = item
for (_i = 0, _len = arr.length; _i < _len; _i++) {
item = arr[_i];
foo = item;
}
Нет спецификации ECMAScript 4, слили её, переписав в ECMAScript 5.
любое расширение прототипа массива (например, полифил ECMAScript 5) — и цикл работает некорректно.
Object.prototype.foo = function () {}; — то да. Если через Object.defineProperty, то будет ОК.В ES3/5/6 никто не мешает обходить массивы через обычные циклы
Object.defineProperty, иных способов задать неперечислимые свойства нет, так что в данном случае совсем не ОК :).forEach местами перепутаны. Я и не спорю — сахар на то и сахар, но если что-то чуть труднее — не значит, что стоит for item in list
# ...
list.forEach(function(item) {
/* ... */
});
for (var i = 0, len = arr.length; i < len; i++) {
var item = arr[i];
/* ... */
}
Вы вообще пословицу про чужой монастырь когда нибудь слышали?
Кто-то протестует против публикации статей о Coffee в хабе Javascript?
Кто-то мешает Вам добиться создания хаба Coffee?
invokeAsap && !timer && fn.apply(ctx, args) (это как раз характерный пример code golf), чтобы с первого взгляда было очевидно, что она делает.needInvoke, если можно проверять timer, как это сделано в debounce?), а колбэк вызывается через arguments.callee (как это работает и, главное, зачем, я, честно говоря, до конца так и не понял).Function.prototype.throttle = (function() { //delay method before next invoke for any function
var self = func = delay = null,
busy = false;
func = function throttle(delay) {
if (busy) {
return false;
} else {
if( isNaN(delay) ) {
return false
} else {
delay = parseInt(delay)
}
self = this;
busy = true;
setTimeout(function() {
busy = false;
}, delay)
return self.apply(this, Array.prototype.slice.call(arguments, 1 ) )
}
}
return func;
})()
Ожидающая функция fnDelay