一次性调用函数

确保函数只被调用一次。

  • 利用闭包,使用一个标志变量 called,并在函数第一次被调用时将其设置为 true,防止再次调用。
  • 为了允许函数的 this 上下文被改变(比如在事件监听器中),必须使用 function 关键字,并将上下文应用到提供的函数上。
  • 使用剩余/扩展 (...) 运算符允许函数接收任意数量的参数。
const once = fn => {
  let called = false;
  return function(...args) {
    if (called) return;
    called = true;
    return fn.apply(this, args);
  };
};

const startApp = function(event) {
  console.log(this, event); // document.body, MouseEvent
};
document.body.addEventListener('click', once(startApp));
// 点击后只运行一次 `startApp`