一文彻底搞懂 JS 闭包

闭包

定义

闭包是指一个引用了另一个函数作用域中变量的函数,由于 JS 中作用域的特性,闭包常用于嵌套函数。

特性

  1. 保存性
  2. 保护性

保存性

保存性是指闭包函数所访问的那些变量不会立即被清除,这是由于 IE6、7 所使用的内存回收机制导致的。

PS:IE6、7 所使用的引用计数垃圾回收机制介绍

引用计数回收算法通过变量是否被引用决定是否回收,而非直观上的回收无用的变量。

由于闭包函数引用了外部作用域中的变量,所以这些变量不会被立即清除,而是会保存在内存中,这也是导致内存泄漏的原因。

保护性

保护性是指闭包函数内定义的变量不会污染外部作用域中的变量,这是由于 JS 的原型链导致的。

PS:原型链介绍

访问一个变量时,首先会在当前作用域中进行查找,如果当前作用域中没有该变量,则向上级作用域中进行查找,就这样递归向上,直到找到,如果找不到,则为 null。

使用场景 - 高阶函数

高阶函数是指返回另一个函数的函数,例如:只执行一次函数 (once)、节流 (throttle)。

只执行一次函数

function once(fn) {
  let isFirst = true;
  return function () {
    if(!isFirst) return;
    fn();
    isFirst = false;
  }
}

节流

function throttle(fn, delay) {
  let timer = null;
  return function () {
    if (timer) return;
    timer = setTimeout(() => {
      fn();
      timer = null;
    }, delay);
  };
}

你可能感兴趣的:(JS,javascript,开发语言,ecmascript)