文章目錄
- 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;}}
};