📢 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代码会更优雅、高效。最后,如果你喜欢本文,欢迎分享给你的编程伙伴一起进步!
????????我们改日再会