• 一文彻底搞懂 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;
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    节流

    function throttle(fn, delay) {
      let timer = null;
      return function () {
        if (timer) return;
        timer = setTimeout(() => {
          fn();
          timer = null;
        }, delay);
      };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    算法岗面经:2023届腾讯算法岗暑期实习一面面经
    用C++ QT实现点击下拉框,选则后自动填写其他项
    PHP基础笔记-NO.3
    (一)文件系统-ext4特性
    MSF生成后门木马
    clipStudioPaint插件开发之服务套件(一)
    rabbitMQ集群搭建
    D. Chip Move(DP,优化时间和空间)
    10-Node.js入门
    不太一样的Go Web框架—编程范式
  • 原文地址:https://blog.csdn.net/Jackson_Mseven/article/details/134521248