对JavaScript中闭包的一些理解

首先推荐一系列文章:深入理解javascript原型和闭包,这个文章最好是有一定编程基础或者对js已经有一定程度的熟悉再看看。

一开始我对闭包不是特别理解,比如说runoob的js教程里有一段自增计数的代码:

<script>
var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
function myFunction(){
    document.getElementById("demo").innerHTML = add();
}
</script>

这段代码很简单,但还是仔细讲解一下防止自己忘记。

首先这段代码存在两个匿名函数,所以先给这两个匿名函数加个名称:

<script>
var add = (function funcA () {
    var counter = 0;
    return function funcB () {return counter += 1;}
})();
function myFunction(){
    document.getElementById("demo").innerHTML = add();
}
</script>


可以看到,代码开头先声明了变量add,并且执行了函数funcA,将并且返回了函数funcB给add,所以变量add是函数。

然后,每调用一次myFunction函数,相当于每次执行了add函数 --> 相当于每次都执行了funcB函数,所以会返回 counter +=1 的结果。

实际运行代码,可以看到counter的数值是不断增加的。这里要提到上面给出的那系列文章——跟上下文环境很作用域有关。

这里不细说,简单来说就是虽然funcB作为闭包(函数)返回给了add,所以每执行一次add()则会生成一次funcB的上下文环境。但是由于其内部调用的参数counter的作用域是funcA,所以funcA的上下文环境也一直保持在内存(理论上如果不是闭包,funcA的上下文环境现在已经销毁),所以counter的值一直保持在内存,可以随函数调用而递增;也因为如此,使用闭包会增加内存消耗。

这里其实跟java蛮像,就是因为存在对象引用而导致对象不会被gc回收,javascript也是存在垃圾回收机制的,这一点往后还要多了解。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值