通俗理解JavaScript闭包

最近几天看了好多文章,学习闭包。

普遍认为,闭包是JavaScript中高深的技术,也是最实用的技术,也是最难懂的技术,也是JavaScript的精华。

什么是闭包?一句话说不清楚。也缺乏一个完整的定义。官方解释:绑定了数据和数据存在的环境的一个技术。

下面是一个使用闭包技术的例子:

 最终目的是访问局部变量localnum,为什么搞得这么复杂?

JavaScript编程中,一个变量如果不在函数中定义,那么它就是公用变量,作为公用变量谁都可以访问它,也可能改变它。如果不想让它接受不可靠的访问,应该定义成局部变量。局部变量必须在函数内部定义。所以,上述为了定义了一个局部变量localnum,构造了一个函数fun()。

但是局部局部变量只能在函数内部存在,只能在函数内部被使用,被变化。所以在外部函数fun内部创建了一个内部函数nbfun来调用或者改变局部变量localnum。

局部变量只能通过内部函数来访问或者变化,那我们怎么才能使用内部函数呢?闭包技术为我们打开了一扇窗户,那就是return nbfun,通过返回内部函数的方式让我们使用内部函数nbfun。

例子中,用变量n来调用函数fun,其实质调用的是内部函数nbfun。通过n()来使用它。

一般来说,函数调用完毕就会被销毁,占用空间会被收回,这时局部变量localnum也就不存在了。但是,上述代码中,由于n=fun()调用的存在,内部函数nbfun被使用,外部函数fun作为内部函数nbfun存在的前提,不能被销毁。这就像内部函数nbfun围绕localnum这个核心,共同作为一堆东西而存在。外部函数fun像一个包单一样,把这些东西保护起来,外部看起来就像是一个封闭的包裹,所以它有一个形象的叫法:闭包。其实它是一个技术手段。

闭包技术保护了数据,又不影响使用数据。闭包中除内部数据以外的东西,就是官方所称的被保护的数据保持存在所需要的环境。

我们不得不佩服这种构思的巧妙。

闭包技术为啥是高端技术?因为它不好理解。高深莫测的技术一定是高端技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值