请大神帮忙解释下这个闭包问题的代码段

function makeCounter()
{
  var obj = {counter: 0};
  return {
    inc: function(){obj.counter ++;},
    get: function(){return obj.counter;}
  };
}

counter1 = makeCounter();
counter2 = makeCounter();

counter1.inc();

alert(counter1.get()); // returns 1
alert(counter2.get()); // returns 0

最近在看闭包,我能理解的程度是外面的函数返回两个函数,应该是个闭包,其余就不知道这段代码干了什么事情了

阅读 2.2k
3 个回答

makeCounter函数返回的是一个对象,该对象为:

 {
    inc: function(){obj.counter ++;},
    get: function(){return obj.counter;}
}

counter1.inc(),中inc属性是一个函数的引用,加上括号在后面就是对函数的调用,所以counter1的obj.counter由0变1。counter1.get(),即是调用返回对象中的get属性对应的函数,该函数返回的是obj的counter属性的值,即为改变后的1。用同样的方法去理解counter2即可。

其实就是将 obj 这个变量缓存起来了,不至于被浏览器给回收了。

    counter1 = makeCounter();
    counter2 = makeCounter();

这两个拿到的是两个不一样的闭包。缓存的obj也互不影响

这个应该是关于作用域的问题,makeCounter 函数的作用是在调用此函数时返回一个对象;makeCounter 函数中,定义了inc,和get方法,则这两个方法的作用域就包括了前面定义的obj这个对象;在每次执行makecounter方法时,会开辟一个新的内存区域来存储这个内容,所以说2次调用的makeCounter 函数返回的对象对应的是2个不同的作用域。表达的不太好,建议去看看作用域和活动对象的一些基本知识

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题