javascript - 闭包定义在对象中的问题
高洛峰
高洛峰 2017-04-11 10:36:48
[JavaScript讨论组]

看犀牛书关于闭包的相关章节,看到一个关于闭包的问题,对结果不是十分理解

function counter() {
    var n =0;
    return {
        count:function() {return n++;},
        reset:function() {n=0;}
        };
        }
var c = counter(), d = counter();
c.count()                           //0
d.count()                           //0
c.reset()
c.count()
d.count()

对 第二个0不是太理解,为什么同一对象下的方法可以共享一个状态n,另一个对象共享的是另一个状态n,感觉不管哪个对象下方法定义的函数的内部[[scope]]都是一样的,为什么不是一起共享状态n呢?

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(3)
伊谢尔伦
function counter() {
    var n = 0;
    return {
        count: function() {
            return n++;
        },
        reset: function() {
            n = 0;
        }
    };
}
var c = counter(),
    d = counter();
console.log(c === d)//false 其实c和d是两个对象。

c.count() //0
d.count() //0
c.reset()
c.count()
d.count()
ringa_lee

c对象的n和d对象的n其实是不同的。

var c = counter(), d = counter();

将counter方法运行了两遍,其中的作用域是不同的。
如果想让c,d共享一个变量,counter方法可以这么写:

var counter =  (function () {
    var m = 0;//这个是共享的变量;
    return function(){
        var n =0;//每次执行后的都不相干涉,类似对象的私有变量;
        return {
            classCount : function(){return m++;},
            classCountReset : function(){m=0},
            count:function() {return n++;},
            reset:function() {n=0;}
            };
        };
     })();
var c = counter(), d = counter();
c.count();                           //0
d.count();                           //0
c.classCount();                      //0
d.classCount();                      //1
c.classCount();                      //2
c.reset();
c.count();                           //0
d.count();                           //1
c.classCountReset();
c.classCount();                      //0
d.classCount();                      //1
c.classCount();                      //2
大家讲道理

因为你实例化了2个不同的对象

console.log(c === d); // false
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号