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
最近在看闭包,我能理解的程度是外面的函数返回两个函数,应该是个闭包,其余就不知道这段代码干了什么事情了
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
makeCounter函数返回的是一个对象,该对象为:
counter1.inc(),中inc属性是一个函数的引用,加上括号在后面就是对函数的调用,所以counter1的obj.counter由0变1。counter1.get(),即是调用返回对象中的get属性对应的函数,该函数返回的是obj的counter属性的值,即为改变后的1。用同样的方法去理解counter2即可。
其实就是将 obj 这个变量缓存起来了,不至于被浏览器给回收了。
这两个拿到的是两个不一样的闭包。缓存的obj也互不影响
这个应该是关于作用域的问题,makeCounter 函数的作用是在调用此函数时返回一个对象;makeCounter 函数中,定义了inc,和get方法,则这两个方法的作用域就包括了前面定义的obj这个对象;在每次执行makecounter方法时,会开辟一个新的内存区域来存储这个内容,所以说2次调用的makeCounter 函数返回的对象对应的是2个不同的作用域。表达的不太好,建议去看看作用域和活动对象的一些基本知识