0
点赞
收藏
分享

微信扫一扫

什么是闭包

哈哈我是你爹呀 2022-02-19 阅读 124
开发语言

实现闭包的意思其实很简单,很多所谓的教材相当一部分是在装13,另一部分则是只是在用一些所谓高深词来糊弄。还有甚者自己都不清楚胡诌。在下来以最通俗的语言来讲讲什么是闭包,以及java的实现方式。

1.闭包的本质就是代码片断。如果一个变量代表的是一段文字,一个数字。数学、字符串可以用变量来存载。而代码用的则是闭包。所以闭包可以理解成一个代码片断的引用。

2.最早的代码片段出现在c语言里,也就是函数指针,变量指针如char*代表字符串。而函数的指针则是代表的一个函数或者说一段代码。

3.大家都知道函数的参数有int型,char型这些。但如果传的是一个方法为参数。这时这个参数的类型就是函数指针,而传的具体的方法,我们就把它叫做闭包。

4.java在jdk8以前不支持函数指针所以使用内部类加外部接口的反向实现。

5.闭包可以说就是一段代码(有别于字符串反射的代码)。举例:A让B做一件事情,一种不停的去问B做完了没有。另一种就是A写一个接口,让B做完了去调用这个接口,即B做完了后去调用这个接口。然后A只需要实现这个接口,而这个接口的实现代码里就是B做完了的事情,这就是接口反向调用,而这也是闭包的最经典应用。


一个简单的闭包如下:

function a(){

var i=10;

return function b(){

console.log(i)

}

}

var c=a();//运行此处返回的是b函数

c();//执行b函数

从此处可以看出,其实闭包一句话总结就是:函数嵌套函数,然后外部函数能够获取到函数内部的私有数据;

那么闭包的好处是什么呢?

好处:

   其实,在函数外部我们想获取函数内部的变量,数据这些,是无法获取到的,而闭包正好满足了这一点。所以,闭包最大的好处就是,能够在函数外部获取到函数内部的私有数据,这些变量和数据会一直存在函数中,不会在调用函数之后被垃圾回收机制回收。

坏处:

而由于函数的私有数据会一直存在内存中,这也将导致内存过多,内存消耗大。造成内存泄漏

所以,我们不应该滥用闭包,而为了解决这一缺点,我们可以在退出函数之前,将局部变量删除掉


闭包的定义

闭包是指有权访问另一个函数作用域中的变量的函数。(JS高级程序设计)


那么它有什么用呢,就是当你访问一个变量的时候,就会沿着作用域链一层层往外查找,直到找到为止,如果到了最外层即全局执行环境下还没找到则报错。

闭包的实现

下面通过具体例子来解释:

Copy
function a() {
var text = ‘呵呵哒’;
return function () {
console.log(text);
}
}
var b = a();
b();

当a()函数被执行后返回了一个匿名函数,这个匿名函数的作用域链上有引用到a()执行环境的活动对象属性text(不知道活动对象是什么的请看上面变量对象的解释)。

a()函数执行完就马上被销毁了,但是这个函数的变量对象仍然被b所引用,所以它的变量对象不会被垃圾回收机制处理掉,而是会留在内存中。这就形成了一个闭包。最后执行b()依然能读取到已经被销毁的a函数的定义的text变量。

我们换个更清晰的例子:

Copy
function a() {
var i = 0;
return function () {
console.log(i++);
}
}
var b = a();
b(); //0
b(); //1
b(); //2

这个例子三次调用b()会分别输出0、 1、 2,是因为a()的变量对象被return的闭包函数引用着,所以i会一直留在内存中,并只能被闭包函数所访问。这个闭包函数被赋值给了b,所以b()能对i变量进行自增计算。

闭包的作用

什么,你问我闭包有什么用?

好处就是隐藏变量,然后搭起一条沟通的桥,闭包可以间接操作这个隐藏变量;并且让这个变量留在内存中而不会污染到全局变量。

坏处呢消耗内存,如果一直不释放这个闭包就会一直占用着内存。那要怎么释放呢?很简单,和函数一样赋值null就可以了。(b = null)


回调函数:通俗的解释就是把函数作为参数传入进另一个函数中使用;PHP中有许“需求参数为函数”的函数,像array_map,usort,call_user_func_array之类,他们执行传入的函数,然后直接将结果返回主函数。好处是函数作为值使用起来方便,而且代码简洁,可读性强。

匿名函数,即没有一个确定函数名的函数,只能在创建时调用或做参数使用。

闭包,是一种对作用域进行封装的方式,使得函数能使用父作用域中的变量。

回调的作用:利用回调,可以在运行时将与组件的核心任务没有直接关系的功能插入到组件中。有了组件回调,你就赋予了他人在你不知道的上下文中扩展你的代码的权力。


举报

相关推荐

0 条评论