闭包-计数器
学习闭包时的计数器例子:
1 function makeCounter() { 2 let count = 0; 3 4 return function() { 5 return count++; 6 }; 7 } 8 let counter = makeCounter(); 9 alert(counter()); //0 10 alert(counter()); //1 11 alert(counter()); //2
没学习闭包之前不是很懂,每次调用makeCounter()的时候不都把count变量置为0了吗?学习闭包后我的理解:
makeCounter()返回的是一个函数,如果直接alert( makeCounter() )是这样的:
代码第8行let counter = makeCounter()后,调用counter()即为调用第四行的嵌套函数。
第一次调用counter()后立即创建新的词法环境,但该词法环境属性中没有count变量,于是向外部函数的词法环境寻找count变量,寻找到count=0,对count++,由于使用的是后置++,此次返回的还是0,但count变量已经是1了。(若使用前置++则第一次返回的是1)
第二次调用后与第一次相同,向外部寻找count,此时count是1,对其后置++后变为2,但返回的仍然是1。以此类推。
上述仅为学习后的个人理解,如有错误还请指正。