闭包就是个bug。我相信作者在写javascript的时候都没想到用户会这么用。

闭包其实是利用了一个变量退出作用域的时候,暂时没有被销毁,它的值还在,如果后面有变量也叫这个名字,那这个数据会被重新利用起来。你会发现,后面你使用的这个名字一样的变量是有初值的。下面的例子可以看出问题来。

<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>


<!DOCTYPE html>

<html>

<head>

<meta charset="utf-8">

<title>菜鸟教程(runoob.com)</title>

</head>

<body>

<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>

</body>

</html>


执行上面的代码可以看的很清楚。计数器一样正常工作。

所以,闭包就是利用了个bug: 退出作用域的变量不会立即销毁。会影响后面的同名变量。

但不知道后面的javascript版本会不会修改这种机制。

所以代码这么写是不可靠的。太依赖于javascript的内部实现了。

其实要实现全局计数器的需求。正常的做法是:

定义一个全局对象。这个对象定义自己的属性和方法add。

用的时候 对象.add 就可以了。这个才正常。

上面用闭包的方式太过巧妙,给人的感觉就是在夹缝中求生存。用起来也不舒服吧。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

热门产品

php编程基础教程.pptx|php编程培训,php,编程,基础,教程,pptx
php编程基础教程.pptx

历史上的今天:04月29日

热门专题

外贸网站建设|外贸网站建设,英文网站制作,英文网站设计,美国主机空间,外贸建站平台,多语言网站制作
外贸网站建设
云南巨榕教育投资集团有限公司|云南巨榕教育投资集团有限公司,巨榕教育集团,巨榕教育
云南巨榕教育投资集团有限公司
小程序开发|微信小程序,小程序开发,小程序,小程序制作,微信小程序开发,小程序公司,小程序开发公司,分销,三级分销系统,分销系统
小程序开发
中源管业|中源管业,中源管业公司,中源管业有限公司,中源管业电话,中源管业地址,中源管业电力管,中源管业mpp电力管,中源管业cpvc电力管,中源管业pe穿线管
中源管业
弥勒综合高中|弥勒综合高中
弥勒综合高中
昆明网站建设|昆明网站建设,昆明网站开发,昆明网站建设公司,昆明网站建设价格,昆明网站设计,昆明网站制作,网页设计,高端网站建设,高端网站设计
昆明网站建设
国家开放大学|国家开放大学报名,国家开放大学报考,国家开放大学,什么是国家开放大学,国家开放大学学历,国家开放大学学费,国家开放大学报名条件,国家开放大学报名时间,国家开放大学学历,国家开放大学专业
国家开放大学
开放大学|开放大学报名,开放大学报考,开放大学,什么是开放大学,开放大学学历,开放大学学费,开放大学报名条件,开放大学报名时间,开放大学学历,开放大学专业
开放大学

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部