以下为ChatGPT自动生成的解答,正确与否请自行判断。
BFE.devAI解答 - JavaScript 代码题
46. 实现`_.once()`
可以自己实现一个once()
函数,使用闭包来缓存结果并实现只调用一次的功能。具体实现如下:
function once(func) {
let called = false
let result
return function(...args) {
if (!called) {
called = true
result = func.apply(this, args)
}
return result
}
}
在这个实现中,called
用于标记原函数是否已被调用过,result
用于缓存调用结果。返回的函数(闭包)首先检查called
的值,如果为false
则调用原函数,并将called
设为true
,将结果保存在result
中。如果called
为true
,则直接返回缓存的结果result
。
这样,在第一次调用返回的函数时,会执行一次原函数,结果会保存在result
中。随后再次调用返回的函数时,由于called
已经为true
,函数不会再次执行,直接返回缓存的结果。
测试代码与预期输出如下:
function func(num) {
return num
}
const onced = once(func)
console.log(onced(1))
// 输出:1
console.log(onced(2))
// 输出:1,因为已经调用过了,前一次的结果被直接返回