新博客地址:http://gengliming.com
小函數(shù)蘊(yùn)含著大學(xué)問
函數(shù)節(jié)流:水龍頭與彈簧
--什么是節(jié)流,請自行百谷--
- Throttle:這種方式是類似水龍頭胁艰,當(dāng)水滴足夠大時水滴就會掉下來款筑;類似的,當(dāng)時間超過某個timeout的時候就執(zhí)行函數(shù)
var throttle = function(fn, timeout) {
var last = new Date().getTimes();
return function() {
var curr = new Date().getTimes();
if (curr - last >= timeout) {
fn.apply(this, arguments);
}
};
};
忽然想到一個問題腾么,如果需要節(jié)流的是scroll事件奈梳,如果滾動的時間超短上面函數(shù)豈不是不能執(zhí)行了,那就這樣實(shí)現(xiàn):
var throttle = function(fn, timeout, delay) {
var timer = null,
last = new Date().getTimes();
return function() {
var curr = new Date().getTimes(),
context = this,
args = arguments;
if (curr - last >= timeout) {
clearTimeout(timer);
timer = null;
last = curr;
fn.apply(context, args);
} else {
timer = setTimeout(function() {
fn.apply(this, arguments);
}, delay);
}
};
};
// 上面這一串代碼居然需要我手動縮緊解虱,也是醉了
- Debounce:bounce是反彈的意思攘须,debouce就是不讓彈,就像彈簧一樣殴泰,你一直按著它于宙,直到放手它才能彈起來;這種思想拿到節(jié)流來說就是:如果你一直滾動艰匙,那函數(shù)就一直不響應(yīng)限煞,直到你不滾動我才執(zhí)行:
var debounce = function(fn, delay) {
var timer = null;
return function() {
var context = this,
args = arguments;
clearTimeout(timer);
timer = setTimeout(function() {
fn.apply(context, args);
}, delay);
};
};
尾遞歸優(yōu)化
不知道尾遞歸?參考中文版员凝,什么署驻?看不懂中文?那就來這里英文版
- Trampoline:蹦床函數(shù),為何叫蹦床旺上?沒明白瓶蚂。這個函數(shù)的作用是把遞歸通過循環(huán)實(shí)現(xiàn)。
function trampoline(fn) {
while (f && f instanceof Function) {
f = f();
}
return f;
}
function sum(x, y){
if (y > 0) {
return sum.bind(null, x+1, y-1);
} else {
return x;
}
}
trampoline(sum(1,100000));
- Tco:不用修改原函數(shù)的尾遞歸優(yōu)化宣吱,我喜歡這個函數(shù)窃这,因?yàn)樗惶美斫猓床欢呐笥颜垍⒖忌厦娴逆溄印?/li>
function tco(fn) {
var value,
active = false,
accumulated = [];
return function accumulator() {
accumulated.push(arguments);
// console.log(active);
if (!active) {
active = true;
while (accumulated.length) {
value = fn.apply(this, accumulated.shift());
}
console.log(value);
active = false;
return value;
}
};
}
var sum = tco(function(x, y) {
if (y > 0) {
return sum(x+1, y-1);
} else {
return x;
}
});
console.log(sum(1, 10000));
參考
JS魔法堂:函數(shù)節(jié)流(throttle)與函數(shù)去抖(debounce):這里貌似比我說的更形象
Understanding recursion in functional JavaScript programming:簡單看了看代碼征候,主要內(nèi)容還是看的中文版的(在下面);
函數(shù)的擴(kuò)展:這是es6教程中的其中一課杭攻,往下拉往下拉然后就看到“尾遞歸”了, 如果嫌麻煩疤坝,那就點(diǎn)上面的錨點(diǎn).