首页 > 编程知识 正文

什么是闭包 及其作用,闭包为什么叫闭包

时间:2023-05-05 02:42:22 阅读:264522 作者:3883

闭包的定义

《JavaScript高级程序设计》:

闭包是指有权访问另一个函数作用域中的变量的函数

《JavaScript权威指南》:

从技术的角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。

《你不知道的JavaScript》

当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。

自己的解释:一个内部函数,有权访问包含其的外部函数中的变量,就形成了闭包。

创建一个闭包 function foo() { var a = 2; return function fn() { console.log(a); }}let func = foo();func(); //输出2

闭包使得函数可以继续访问定义时的词法作用域。拜 fn 所赐,在 foo() 执行后,foo 内部作用域不会被销毁。

闭包的作用

1. 能够访问函数定义时所在的词法作用域(阻止其被回收)。

2. 私有化变量

function base() { let x = 10; //私有变量 return { getX: function() { return x; } }}let obj = base();console.log(obj.getX()); //10

3. 模拟块级作用域

var a = [];for (var i = 0; i < 10; i++) { a[i] = (function(j){ return function () { console.log(j); } })(i);}a[6](); // 6

4. 创建模块

function coolModule() { let name = 'Yvette'; let age = 20; function sayName() { console.log(name); } function sayAge() { console.log(age); } return { sayName, sayAge }}let info = coolModule();info.sayName(); //'Yvette'

模块模式具有两个必备的条件

必须有外部的封闭函数,该函数必须至少被调用一次(每次调用都会创建一个新的模块实例)封闭函数必须返回至少一个内部函数,这样内部函数才能在私有作用域中形成闭包,并且可以访问或者修改私有的状态。闭包的缺陷

常驻内存会增大内存使用量,使用不当很容易造成内存泄露。

如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

 

 

 

 

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。