学习了几种提高性能或优雅程度的函数
记忆函数
1.以一个阶乘的函数为例,这样的函数能缓存计算过的值,并直接返回,可以免去再次计算。
let count = 0
let cache = {}
function factorial(n){
if(cache[n]){
return cache[n]
}
count++
if(n == 1){
return 1
}
cache[n] = n * factorial(n - 1)
return cache[n]
}
用count记录函数的计算次数,由于记忆函数缓存了参数为5之前的计算,所以count为7
let num = factorial(5)
let num2 = factorial(7)
console.log(count, num, num2) // 7 120 5040
2.可以封装一个记忆的功能函数
function memorize(fn) {
let cache = {}
return function (){
let key = arguments.length + Array.prototype.join.call(arguments)
if(cache[key]){
return cache[key]
}else{
// 只能用于一般函数,由于递归函数内部有调用自己的行为,这个函数并不能记录
cache[key] = fn.apply(this, arguments)
return cache[key]
}
}
}
以下是函数经过记忆后运行的例子,可以明显的发现,第二次运行时是几乎不花时间的
function jie(n){
console.log( ++count )
if(n == 1){
return 1
}
return n * jie( n - 1 )
}
let j = memorize(jie)
console.time(1)
j(500)
console.timeEnd(1) //1: 1130.169ms
console.time(2)
j(500)
console.timeEnd(2) //2: 0.025ms