闭包——十万个为什么
什么是闭包?
简单的来说闭包就是函数。那函数是不是闭包呢?
网上有一句话js函数皆是闭包。我觉得这句话是不太精确。我们先这直接忽略这个说法
先来看下 相对官方说法:闭包是指有权访问另一个函数作用域中的变量的函数? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
看到这据话有点懵,所以我们拆解下变成 ————闭包是指有权访问另一个(函数作用域中的)变量的函数
在换成我的了解:闭包就是函数嵌套函数,里面的函数引用外面函数的变量。
什么是函数嵌套函数?
举个粟子1
function fun1(){
? function fun2(){
? ? ? ? {
}
什么是里面的函数引用外面函数的变量。
举个粟子2
function fun1(){
? ? ? var n=10;
? ? ? function fun2(){
? ? ? ? ? console.log(n);//这里的n没公告,使用的是上级作用域fun1的n
? ? ? }
? }
{友情提醒基础比较好的可以直接跳到下面看? ??闭包的超级简单粟子}
闭包有什么特性?
闭包有三个特性
函数嵌套函数
函数内部可以引用外部的参数和变量
参数和变量不会被垃圾回收机制回收
函数嵌套函数这个在粟子1中已经说了
函数内部可以引用外部的参数和变量在粟子2也说了
参数和变量不会被垃圾回收机制回收这个又是什么意思呢?
闭包不也是函数吗?这么可能不会被回收呢?而且不是说
局部变量会在函数完成时被删除吗?
我们先带着这个疑问,做几道题
带着 在函数开始时会创立局部变量,在函数完成时会删除它们 这个问题看下面代码。
也就是说函数没调用前只是公告跟定义,并木有被创立,等到调用了才创立(换句话说假如没被调用就相当于function fun(){},调用才创立里面的代码)
有人问为什么代码被销毁了第二个fun1();还可以调用?那是由于函数在调用时候才往里面加代码
假如还不了解,那就换个比喻,如果有一个盒子1,放在上面,没调用之前,我放着,调用时,我拿东西装进去,调用完,我就扔掉这个盒子1里面的东西;而后在第二次调用之前,我用盒子1在把里面的东西装进去,调用时,我继续放东西进去,调用后我继续扔掉盒子东西。
我们在看下面代码
为什么第二个fun1();控制台输出的是12?
这里有一个圈套,a++ 没有在局部变量公告所以用的是全局变量的a所以会改变全局变量 var a = 10的值 变成var a = 11?;(全局变量会在您关闭页面是被删除。)
还要一定一件事就是第一个fun1()调用后完成后就销毁。
调用第二个fun1()时;全局变量的var a = 11;所以控制台输出是12;
理解了上面两个代码后我们在看一下
闭包的超级简单粟子
从这个粟子中我们可以fun1();也是会销毁的,不过是要等到内部函数结束后才销毁,所以利用这个特点就产生了闭包这种说法。
在回顾下 参数和变量不会被垃圾回收机制回收这句话
这句话我觉得也有点毛病 应该说这是一个相对于谁的问题,是暂时不会被回收。
最后在说下 闭包的目的和优缺点
目的:使用闭包主要是为了设计私有的方法和变量。
闭包的优点是可以避免全局变量的污染,
缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄漏。
在在在最后,在顺便理解下JavaScript垃圾回收的机制(理解懂吧,就理解就行啦)
JavaScript垃圾回收的机制很简单:找出不再使用的变量,而后释放掉其占用的内存
什么叫不再使用的变量?
不再使用的变量也就是生命周期结束的变量,当然只可能是局部变量,全局变量的生命周期直至浏览器卸载页面才会结束。局部变量只在函数的执行过程中存在,而在这个过程中会为局部变量在栈或者堆上分配相应的空间,以存储它们的值,而后再函数中使用这些变量,直至函数结束(闭包中因为内部函数的起因,外部函数并不能算是结束)
结尾什么是闭包
闭包是指:有权访问另一个 函数作用域中的 变量的函数
上面这话如何了解——–我的了解:闭包就是函数嵌套函数,里面的函数引用外面函数的变量。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 闭包——十万个为什么