什么叫闭包?JavaScript

闭包是JavaScript中非常重要的一个概念,下面我们来谈谈什么是闭包

借用百度百科关于闭包的定义:
闭包就是能够读取其他函数内部变量的函数。
由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。
在本质上,闭包是将函数内部和函数外部连接起来的桥梁

先假设有这么一个函数:

function nv(){
var n=10;
}

它里面定义了一个变量n,同时他不会直接将n返回,然后我想获取他里面定义的这个n。该怎么办呢?
我在控制台尝试在函数外直接打印出这个n,很明显,直接报错了、显示的是n没定义。

想了下,上面说的是不能直接将n返回,那我将它间接返回应该是可以的啥。

比如我在这个函数里面在定义一个函数subNv,然后让nv直接返回subNv这个函数,而subNv这个函数由于是定义在函数nv里面,所以可以获取到局部变量n,这样让subNv返回可以了啥。
代码如下:

function nv(){
var n=10;
function subNv(){return n;}
return subNv;
}
var subNv=nv();
subNv()

此时看下运行效果:

在上图中,成功的得到了n值。
总结下:
当有个函数(nv)的内部有个局部变量(n),这个变量无法在外面直接得到时,我们通过在这个函数里面在定义一个函数(subNv),并且用这个定义的函数去得到这个局部变量,最后我们在返回这个子函数(subNv),就能通过返回的这个函数得到局部变量n

这时我们在去看看关于闭包的定义:

  1. 闭包就是能够读取其他函数内部变量的函数。
  2. 由于在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。
  3. 在本质上,闭包是将函数内部和函数外部连接起来的桥梁

第一遍没看懂?再看第二遍!
第二不行?在来第三遍!
现在看懂了吧。没错,你想的没错!

  1. subNv能读取nv中的变量,所以subNv就是闭包。

  2. 这个闭包subNv是定义在nv里面的一个函数,

  3. 闭包subNv作为一个桥梁将函数nv和函数外部联系起来了,是的函数外部也能获取到函数nv里面定义的变量。

闭包的作用:

  1. 闭包能够获取函数中定义的局部变量

  2. 由于使用闭包就等于使用了函数内部定义的酒吧变量,所以闭包会使得函数中的变量都被保存在内存中,不会被销毁

类比:

如果你学过面向对象的语言,比如javas,c++,c#等,那么其实你可以发现,
如果把某个函数当成一个类的话,定义在其中的局部变量很像是类的私有属性, 而闭包则像其专用于获局部变量的私有方法(只是从功能方式上简单的类比下,本质上他们是不一样的)

注意:闭包会使得函数中的局部变量保存在内存中,从而内存消耗很大。因此不要滥用闭包,否则会造成网页的性能降低。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值