实现一个计数器,counter 函数最初返回 n,每次调用它时会返回前一个值加 1 的值;
var createCounter = function (n) {
return function () {
return n++
}
}
const counter = createCounter(-2);
console.log("counter", counter());
console.log("counter", counter());
console.log("counter", counter());
console.log("counter", counter());
输出[-2,-1,0,1]
闭包满足n的变量,调用过程中不会在外部被改变,也不会被重置。
在js中所有函数都可以访问上一层作用域,父函数中定义子函数,子函数可以访问父函数中的值,子函数相当于一个闭包函数。父函数调用子函数进行计数,n不会被重置,且不能被外部所改变,只有重新调用父函数,才会重置。
调用父函数时,返回的是一个函数,相当于要执行createCounter()() 才会有输出值;
也可以如此定义:
var createCounter = (function (n = 0) {
return function () {
return (++n);
}
})();//定义了父函数,同时立即执行该函数,返回一个闭包函数
console.log("counter", createCounter());
console.log("counter", createCounter());
console.log("counter", createCounter());