developer-plus / interview

https://interview.developer-plus.org
MIT License
9 stars 1 forks source link

实现一个 once 函数, 传入函数参数只执行一次 #17

Open Hongbusi opened 2 years ago

Hongbusi commented 2 years ago
function once(fn) {
  let flag = true
  return function () {
    if (flag) {
      fn()
      flag = false
    }
    return undefined
  }
}
luckept commented 2 years ago

朴实无华版

function once(fn) {
    let _window = window;
    if (!_window.onceSet) {
      _window.onceSet = new Set();
    }
    if (!_window.onceSet.has(fn)) {
      fn();
      _window.onceSet.add(fn);
    }
}

const fn = () => {
    console.log("hi");
};
once(fn);
once(fn);
baboon-king commented 2 years ago
const 我是一个只能执行一次的函数 = () => {
  console.log("好可怜,我只能执行一次");
};

const once = (() => {
  let called = false;
  return function (fn) {
    if (!called) {
      called = true;
      return fn();
    }
  };
})();

once(我是一个只能执行一次的函数);
once(我是一个只能执行一次的函数);

image

baboon-king commented 2 years ago

朴实无华版

function once(fn) {
    let _window = window;
    if (!_window.onceSet) {
      _window.onceSet = new Set();
    }
    if (!_window.onceSet.has(fn)) {
      fn();
      _window.onceSet.add(fn);
    }
}

const fn = () => {
    console.log("hi");
};
once(fn);
once(fn);

卧槽卧槽!简直神之一手啊!

Rainer-Yu commented 2 years ago

简单直接

const onceSet = new Set();
const once = (fn) => {
    if (!onceSet.has(fn) && onceSet.add(fn)) fn?.()
};

const fn = () => {
    console.log("hi");
};
once(fn);
once(fn);
once(fn);
Hongbusi commented 2 years ago

简单直接

const onceSet = new Set();
const once = (fn) => {
    if (!onceSet.has(fn) && onceSet.add(fn)) fn?.()
};

const fn = () => {
    console.log("hi");
};
once(fn);
once(fn);
once(fn);

可以实现,但是多了一个污染变量,还可以优化~

chenfan0 commented 2 years ago

勉强实现

function once(fn) {
  if (!once.execute) {
    fn()
    once.execute = true
  }
}

const foo = () => console.log('once')
once(foo)
once(foo)
ChenHaoJie9527 commented 2 years ago

闭包版

function before(n, func) {
  let result
  if (typeof func !== 'function') {
    throw new TypeError('Expected a function')
  }
  return function(...args) {
    if (--n > 0) {
      result = func.apply(this, args)
    }
    if (n <= 1) {
      func = undefined
    }
    console.log('result', result);
    return result
  }
}
function once(func) {
  return before(2, func)
}
const res = once((arg) => arg);
console.log('once', res(10));
console.log('once', res(2));
jp-liu commented 2 years ago
function once(fn, maxExec = 1) {
    let onceFn = () => {
        if(maxExec === 0) return
        maxExec--
        fn()
    }
    return onceFn
}
const a = once(() => console.log(1324), 2)