以下为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中。如果calledtrue,则直接返回缓存的结果result

这样,在第一次调用返回的函数时,会执行一次原函数,结果会保存在result中。随后再次调用返回的函数时,由于called已经为true,函数不会再次执行,直接返回缓存的结果。

测试代码与预期输出如下:

function func(num) {
  return num
}

const onced = once(func)

console.log(onced(1)) 
// 输出:1

console.log(onced(2))
// 输出:1,因为已经调用过了,前一次的结果被直接返回