📢 鸿蒙专栏:想学鸿蒙的,冲
📢 C语言专栏:想学C语言的,冲
📢 VUE专栏:想学VUE的,冲这里
📢 CSS专栏:想学CSS的,冲这里
📢 Krpano专栏:想学VUE的,冲这里
📢 JavaScript专栏:想学JavaScript的,冲这里
🔔 上述专栏,都在不定期持续更新中!!!!!!!
目录
✨ 前言
什么是闭包
闭包的作用
实现闭包的条件
闭包的生命周期
✨ 结语
✨ 前言
闭包(Closure)是JavaScript中一个非常重要却容易让人困惑的概念。明明是一个函数,为什么还能引用外部变量?今天我将为你揭开JavaScript闭包的神秘面纱,通过简单易懂的例子让你明白闭包的实际应用场景和作用。你将会对闭包有一个全新的认识,并能够在以后的代码中灵活运用它。跟着我一起抓住JavaScript闭包的真谛,成为JS高手吧!
什么是闭包
闭包(Closure)是JavaScript一个很重要的概念,它使函数拥有保持其作用域链的能力。
简单说,闭包让函数记住并继续访问定义函数的词法作用域,即使函数是在当前词法作用域之外被执行。
闭包的作用
闭包的主要作用有:
- 让函数访问外部变量
function outer() { const x = 10; function inner() { return x; } return inner; } const getX = outer(); getX(); // 返回10
- 封装变量,减少全局变量污染
function counter() { let count = 0; return function() { return count++; } } const c1 = counter(); c1(); // 0 c1(); // 1
- 实现模块和信息隐藏
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
实现闭包的条件
- 函数嵌套
- 内部函数引用外部函数的变量
- 外部函数返回内部函数
满足这三个条件就可以实现一个闭包。
闭包的原理可以简单概括为:
- 函数与其周围状态(lexical environment,又称词法环境)的组合。这个环境包含了函数定义时候的作用域中的任何局部变量。
- 当函数在其词法作用域以外被调用时,就会生成闭包。闭包会使原来的词法作用域链保持alive。所以闭包函数仍然可以访问定义时作用域中的变量。
- 闭包可以访问定义函数时的作用域。即使函数在定义作用域外被执行,那个作用域链并不会被销毁,仍然可被闭包访问。
- 闭包保留了原始作用域链,所以会比其他函数占用更多内存。
简单总结闭包的原理:
- 函数执行时形成作用域
- 函数和其周围状态的引用组合形成闭包
- 这个组合使函数仍可访问定义时作用域的变量
- 即使在定义作用域外执行
所以说闭包是函数和其词法作用域的组合,可以通过闭包访问初始作用域的变量,起到封装变量的作用。
闭包的生命周期
闭包的作用域链不会被垃圾回收机制回收,因此会常驻内存。
过度使用闭包可能会导致内存占用过多。
正确使用闭包,在适当场景下可以提高代码优雅性,封装性,模块化。
以上简要介绍了JavaScript闭包的概念、作用和实现。它是JavaScript一个非常重要的概念,合理利用闭包可以编写出更优雅高效的代码。
✨ 结语
通过今天的学习,我们已经掌握了闭包的含义、实现条件、作用场景等,并通过示例代码加深了理解。闭包是JavaScript一个强大的特性,合理使用闭包可以帮我们封装变量,减少污染,实现信息隐藏。在模块化编程中,它也有非常重要的作用。但是滥用闭包也会导致内存问题。正确看待和运用闭包,我们的JavaScript代码会更优雅、高效。最后,如果你喜欢本文,欢迎分享给你的编程伙伴一起进步!
我们改日再会