震惊!原来这就是JavaScript闭包的秘密

发布时间:2024年01月05日

📢?鸿蒙专栏:想学鸿蒙的,冲

📢 C语言专栏:想学C语言的,冲

📢?VUE专栏:想学VUE的,冲这里

📢?CSS专栏:想学CSS的,冲这里

📢 Krpano专栏:想学VUE的,冲这里

?📢 JavaScript专栏:想学JavaScript的,冲这里

🔔 上述专栏,都在不定期持续更新中!!!!!!!

目录

? 前言

什么是闭包

闭包的作用

实现闭包的条件

闭包的生命周期

? 结语


? 前言

????????闭包(Closure)是JavaScript中一个非常重要却容易让人困惑的概念。明明是一个函数,为什么还能引用外部变量?今天我将为你揭开JavaScript闭包的神秘面纱,通过简单易懂的例子让你明白闭包的实际应用场景和作用。你将会对闭包有一个全新的认识,并能够在以后的代码中灵活运用它。跟着我一起抓住JavaScript闭包的真谛,成为JS高手吧!

什么是闭包

????????闭包(Closure)是JavaScript一个很重要的概念,它使函数拥有保持其作用域链的能力。

????????简单说,闭包让函数记住并继续访问定义函数的词法作用域,即使函数是在当前词法作用域之外被执行。

闭包的作用

闭包的主要作用有:

  1. 让函数访问外部变量
    function outer() {
      const x = 10;
      function inner() {
        return x; 
      }
      return inner;
    }
    
    const getX = outer();
    getX(); // 返回10

  2. 封装变量,减少全局变量污染
    function counter() {
      let count = 0;
      return function() {
        return count++; 
      }
    }
    
    const c1 = counter();
    c1(); // 0
    c1(); // 1

  3. 实现模块和信息隐藏
    function Person(name) {
      const age = 18;
      
      return {
        getName: function() {
          return name;
        },
        getAge: function() {
          return age;
        } 
      };
    }
    
    const me = Person('Jack');
    me.getName(); // Jack
    me.getAge(); // 18

实现闭包的条件

  • 函数嵌套
  • 内部函数引用外部函数的变量
  • 外部函数返回内部函数

满足这三个条件就可以实现一个闭包。

闭包的原理可以简单概括为:

  1. 函数与其周围状态(lexical environment,又称词法环境)的组合。这个环境包含了函数定义时候的作用域中的任何局部变量。
  2. 当函数在其词法作用域以外被调用时,就会生成闭包。闭包会使原来的词法作用域链保持alive。所以闭包函数仍然可以访问定义时作用域中的变量。
  3. 闭包可以访问定义函数时的作用域。即使函数在定义作用域外被执行,那个作用域链并不会被销毁,仍然可被闭包访问。
  4. 闭包保留了原始作用域链,所以会比其他函数占用更多内存。

简单总结闭包的原理:

  • 函数执行时形成作用域
  • 函数和其周围状态的引用组合形成闭包
  • 这个组合使函数仍可访问定义时作用域的变量
  • 即使在定义作用域外执行

????????所以说闭包是函数和其词法作用域的组合,可以通过闭包访问初始作用域的变量,起到封装变量的作用。

闭包的生命周期

闭包的作用域链不会被垃圾回收机制回收,因此会常驻内存。

过度使用闭包可能会导致内存占用过多。

正确使用闭包,在适当场景下可以提高代码优雅性,封装性,模块化。

????????以上简要介绍了JavaScript闭包的概念、作用和实现。它是JavaScript一个非常重要的概念,合理利用闭包可以编写出更优雅高效的代码。

? 结语

????????通过今天的学习,我们已经掌握了闭包的含义、实现条件、作用场景等,并通过示例代码加深了理解。闭包是JavaScript一个强大的特性,合理使用闭包可以帮我们封装变量,减少污染,实现信息隐藏。在模块化编程中,它也有非常重要的作用。但是滥用闭包也会导致内存问题。正确看待和运用闭包,我们的JavaScript代码会更优雅、高效。最后,如果你喜欢本文,欢迎分享给你的编程伙伴一起进步!

????????我们改日再会

文章来源:https://blog.csdn.net/qq_41152573/article/details/135404866
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。