【JS-Leetcode】2621睡眠函数|2629复合函数|2665计数器||
文章目录
- 2621睡眠函数
- 2629复合函数
- 2665计数器||
这三个题目涉及setTimeout、promise、数组reduce方法,闭包。
2621睡眠函数
请你编写一个异步函数,它接收一个正整数参数 millis ,并休眠 millis 毫秒。要求此函数可以解析任何值。
- 原理:返回一个promise,在这个promise中进行一个对应时长的延迟setTimeout,延迟结束执行resolve。
async function sleep(millis) {return new Promise((resolve,reject)=> {setTimeout(()=>{resolve();},millis)})
}
setTimeout的本质是延迟执行,只执行一次。一般用于延迟指定的时间后执行一次回调函数。
setInterval的本质是定时执行,会不断重复执行,直到取消。所以这个题要用setTimeout。
2629复合函数
请你编写一个函数,它接收一个函数数组 [f1, f2, f3,…, fn] ,并返回一个新的函数 fn ,它是函数数组的 复合函数 。
[f(x), g(x), h(x)] 的 复合函数 为 fn(x) = f(g(h(x))) 。
一个空函数列表的 复合函数 是 恒等函数 f(x) = x 。
你可以假设数组中的每个函数接受一个整型参数作为输入,并返回一个整型作为输出。
- 原理:初始值为x,(param,fn)代表param初始值= x,而当前正在处理的数组元素是fn,箭头函数执行fn(param),然后将结果赋给param,作为下一个fn的入参,由于从右往左执行,因此使用reduceRight代替reduce。
/*** @param {Function[]} functions* @return {Function}*/
var compose = function(functions) { return function(x) {return functions.reduceRight((param,fn)=>fn(param),x)}
};
/*** const fn = compose([x => x + 1, x => 2 * x])* fn(4) // 9*/
- 如果这里
functions.reduceRight((target,fn)=>fn(target),x)
还是感觉很晕,可以
对应数组累加和arr.reduce((acc,curvalue)=>acc+curvalue,0)
进行理解。
还不理解就要补点reduce的语法知识了,看JS数组方法reduce来深入了解一下reduce的语法。
2665计数器||
请你写一个函数 createCounter。这个函数接收一个初始的整数值 init。并返回一个包含三个函数的对象。
这三个函数是:
increment() 将当前值加 1 并返回。
decrement() 将当前值减 1 并返回。
reset() 将当前值设置为 init 并返回。
原理:闭包。
什么是闭包?
闭包指的是一个函数可以记住其外部变量并且可以访问这些外部变量。
函数在创建时,会创建一个隐藏起来的environment属性,这个属性记住了它们创建的位置,当在函数内部找不到变量时,它们可以访问外部变量。
在increment()中并没有定义temp,于是访问createCounter()中的temp,++temp会返回+1后的结果,同时这也将修改外部temp的值,所以如果连续调用就会持续加1。其他函数同理。
/*** @param {integer} init* @return { increment: Function, decrement: Function, reset: Function }*/
var createCounter = function(init) {let temp = init;return { increment:function(){return ++temp;},decrement:function(){return --temp;},reset:function(){temp = init;return temp;}}
};