JS中闭包问题

看笔记上有人对这个说是个bug,其实是利用JS中栈内存在执行过程中没有释放的特点,而且还给了例子

<p>局部变量计数。</p>
<button type="button" onclick="myFunction()">计数!</button>
<p id="demo">0</p>
<script>
{
    var tmp = 2; //理论上在退出语句块后,这个变量要被释放掉的。包括内存可能被回收。但事实并非如此,会影响后面和他同名的变量
}

var add = (function () {
    //var counter = 0; //这里注释掉.其实和上面的tmp一样的道理。这里在函数自己执行完后就应该销毁了的。
    //return function () {return counter  += 1;} //这里的counter已经不是上面的counter了,是一个全局变量。有初值,受上面影响,初值为0
    return function () {return tmp += 1;} //这里tmp就是个全局变量。它是有初值的。为上面的2

})();
function myFunction(){
    document.getElementById("demo").innerHTML = add();//3
    document.getElementById("demo").innerHTML = add();//4
    document.getElementById("demo").innerHTML = add(); //5
}

</script>

感觉没有什么毛病,哈哈
然后看到六楼对此进行了错误指明,针对 5楼、6楼 的一些错误进行指明:
5楼:{ var tmp = 2 } JS 中语句块不能独立作用域,这样写等同于声明了一个全局变量 tmp = 2,所以不存在该语句块内代码执行完毕后 tmp 就被销毁的情况。
6楼:变量 add,以及 add 的 count 属性、plus() 方法都是公共的,这意味着其他代码可以直接修改你的 count 属性,造成不必要的麻烦
闭包要解决的问题是:一个函数可以拥有私有变量,并且外部可以通过闭包访问该私有变量,如特权方法(类似 JavaBean 的写法):

<script>
function Student(value) {
    var name = value;
    this.getName = function() { return name; };
    this.setName = function(value) {name = value; };
}
<script>

如果我没看七楼的答案,其实就会误认为六楼的正确性
从自己理解来看,六楼说的bug应该是想说利用全局变量这种特性,从而达到计数的问题,而七楼想要说明的问题是在其函数内部创建出一个私有属性,以此完成计数器,这好比java中的封装属性,其上是我对闭包的一些理解。
详情可以看菜鸟教程
[菜鸟教程闭包问题]

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值