before

"Let go of the thoughts that don't make you strong." —Unknown

本文为 《lodash 源码阅读》 系列文章,后续内容会在 github 中发布,欢迎 star,gitbook 同步更新。

源码

/**
 * 创建一个调用func的函数,通过this绑定和创建函数的参数调用func,调用次数不超过 n 次。
 * 之后再调用这个函数,将返回一次最后调用func的结果。
 *
 * @since 3.0.0
 * @category Function
 * @param {number} n 限制调用func 的次数
 * @param {Function} func 受限制执行的函数
 * @returns {Function} 返回新的函数
 */
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;
    }
    return result;
  };
}

原理

before 首先判断传入的 func 参数类型是否合法,再通过闭包方式缓存次数变量 n 、执行函数 func 以及执行结果 result,返回新的函数,在每次执行返回函数,n 次数减少,当 n <= 1 之后,销毁 func 函数,只返回缓存执行结果 result

let times = 0;
const newFunc = before(3, function() {
  return ++times;
});

newFunc(); // n = 2, 执行传入func,return 1
newFunc(); // n = 1, 执行传入func,return 2
newFunc(); // n = 1, 不执行 func,return 2
newFunc(); // n = 1, 不执行 func,return 2

相关链接

Last updated

Was this helpful?