1.map
//['1','2','3'].map(parseInt) 结果为 [1,NaN,NaN] 为什么
//首先 parseInt 接受一个参数是是取整 两参数是取整根据第二参数变进制
//如parseInt('101',2)->5
//arr.map(parseInt)->parseInt('1') 1,parseInt('2','1') NAN,parseInt('3','2') NAN
//解决 1
['1','2','3'].map(a=>parseInt(a)) //[1,2,3]
//解决 2
function unary(fn){
return fn.length==1?fn:function(arg){
return fn(arg)
}
}
['1','2','3'].map(unary(parseInt))
//解决3
function map(Array,fn){
let results=[]
for (const i of Array) {
results.push(fn(i))
}
return results;
}
2.memoized 保存全局上下文 解决回调 问题方案
//使用递归使代码简洁 让逻辑更容易接受
//但是递归是将先每一层计算 计算到底然后将结果一层一层返回 所以速度慢 性能差
//如何优化递归
//思路 回调 每次都要等待上一步完成才能拿到结果 为什么 不用 对象存储结果
function recursion(n){
if(n==0){
return 1;
}
return recursion(n-1)*n
}
//memozied缓存
function memozied(fn){
const cache={};
return function(arg){
return cache[arg]||(cache[arg]=fn(arg))
}
}
var neeRecu=memozied(recursion);
console.time("timer");
recursion(1000)
console.timeEnd("timer");
//timer: 0.251953125ms
console.time("timer");
neeRecu(1000)
console.timeEnd("timer");
//timer: 0.090087890625ms
3.once 有些函数 只执行一次
function once(fn){
var done=false;
return function(){
return done?undefined:(done=true,fn.apply(this,arguments))
}
}
//dome
function holle(){
console.log('holle word')
}
var prone=once(holle);
prone()//holle word
prone()//不调用
总结: 函数式编程大部分都依赖于闭包产生的变量,也称内存泄漏,变量无法自动销毁,需要手动释放内存