function counter() {
let count = 0;
return function() {
// 这里访问到了counter函数作用域中的count变量
return ++count;
};
}
// 创建一个计数器实例
const myCounter = counter();
console.log(myCounter()); // 输出1
console.log(myCounter()); // 输出2
console.log(myCounter()); // 输出3
变量作用域体现
counter
函数内部声明了变量count
,其作用域仅限于counter
函数内部。
- 内部返回的匿名函数形成了闭包,该匿名函数可以访问到
counter
函数作用域中的count
变量,尽管counter
函数已经执行完毕,其作用域链依然被保存。
闭包保存变量状态解释
- 当
counter
函数执行并返回内部匿名函数时,JavaScript引擎不会销毁counter
函数的作用域。
- 因为返回的匿名函数持有对
counter
函数作用域的引用(形成闭包),所以count
变量的状态得以保存。每次调用返回的匿名函数,都是在同一个保存的count
变量基础上进行操作,从而实现了计数器功能。