- MEMORIZATION
记忆函数以牺牲空间复杂度的方法,利用闭包将需要重复计算的数据存储在闭包中,以便提高代码效率。减少不必要的重复计算
//递归模式记忆函数
var memorize = function(memo,formula){
var recur = function(n){
var result = memo[n];
if(typeof result != "number"){
memo[n] = formula(recur,n);
result = memo[n];
}
return result;
}
return recur;
}
var fibonacci = memorize([0,1],function(recur,n){return recur(n-1)+recur(n-2)});
var factorial = memorize([1],function(recur,n){
return n*recur(n-1)
});
- Currying
柯里化函数本质目的是收集参数并且计算,其主要用途是提高代码模块化,还可以使函数延迟计算。
function curry(fn){
var arr = arguments[1] || [];
var len = fn.length;
return function(){
var innerArgs = Array.prototype.slice.call(arguments);
return function(arg){
if(arg.length === len){
return fn.apply(null,arg);
}
else {
return curry(fn,arg);
}
}(arr.concat(innerArgs))
}
}
//通用叠加柯里化
function plus(num){
var adder = function(){
var args = [];
var innerAdder = function(){
args = args.concat([].slice.call(arguments));
return innerAdder;5
};
innerAdder.toString = function(){
return args.reduce(function(a,b){return a+b;})
};
}
return adder()(num);
}
- DEBOUNCE AND THROTTLE
函数去抖和函数节流两种方法是为了应用于类似mousemove此类事件触发太过频繁。
去抖的意思是防止重复调用,也就是说事件最后调用;节流的意思是防止调用次数太多,每隔interval事件调用一次
function debounce(fn,delay){
delay = delay || 200;
var timer;
return function(){
var that = this;
var arg = arguments;
if(timer)
clearTimeout(timer);
timer = setTimeout(function(){
timer = null;//释放内存好评!
fn.apply(that,arg);
},delay);
};
}
function throttle(fn,interval = 200){
var last;
var timer;
return function(){
var that = this;
var arg = arguments;
var now = +new Date();
if(last && now - last < interval){
clearTimeout(timer);
timer = setTimeout(function(){
last = now;
fn.apply(that,arg);
},interval);
}
else {
last = now;
fn.apply(that,arg);
}
};
}