给定一个整型参数 n,请你编写并返回一个 counter ****函数。这个 counter ****函数最初返回 n,每次调用它时会返回前一个值加 1 的值 ( n , n + 1 , n + 2 ,等等)。
/**
* @param {number} n
* @return {Function} counter
*/
var createCounter = function(n) {
let count =n
return function() {
let result =count
count+=1
return result
};
};
/**
* const counter = createCounter(10)
* counter() // 10
* counter() // 11
* counter() // 12
*/
- 当调用
createCounter(10)时,createCounter函数会被执行,此时创建了一个局部变量count并将其初始化为 10。 createCounter函数返回了一个匿名函数,这个匿名函数“记住”了对count变量的引用。虽然createCounter函数已经执行完毕,但由于返回的匿名函数保持了对count的引用,所以count变量并未被垃圾回收机制清除,而是一直存在于内存中。- 将返回的匿名函数赋值给
counter,这时counter变成了一个拥有闭包特性的函数对象,它可以访问并修改count变量的值,尽管createCounter已经执行结束。 - 每次调用
counter()函数时,它都会使用闭包所保留的count变量的最新值,并对其进行递增,然后返回递增前的值。因此,每次调用都会得到一个递增的计数值。