完成一个生成计数器的函数 plusFor,调用它会返回一个计数器。计数器本身也是一个函数,每次调用会返回一个字符串。
达到以下的效果:
const counter1 = plusFor('小明')
counter1() // => 为小明+1s
counter1() // => 为小明+2s
counter1() // => 为小明+3s
...
const counter2 = plusFor('李梅')
counter2() // => 为李梅+1s
counter2() // => 为李梅+2s
counter2() // => 为李梅+3s
...
注意你只需要完成 plusFor 函数,不要使用额外的全局变量。
答案:
我的答案:
const plusFor = (name) => {
let P = this
if (!P[name]) {
P[name] = 0
} else {
P[name]++
}
let a=() => {
P[name]++
return `为${name}+${P[name]}s`
}
return a
}
网上最优答案:
const plusFor = (name, count = 0) => () =>`为${name}+${++count}s`
我的思路是首先使用plusFor作为一个存储空间,使用P[name]=value的形式将所有用户的数据存储在函数本身当中,然后通过函数中可以向上查找变量的特性,在a函数中引用P对外输出。而最优答案中使用闭包特性返回一个匿名函数,使得外部可以凭借这个匿名函数做中转来引用内部的name和count。
我答案的弊端是对P的定义,以及外部对a的引用,使得plusFor和a两个函数在执行完后无法被销毁,会常驻内存老生代。而最优答案不仅代码量小,且只有
() =>为${name}+${++count}s
匿名函数会常驻老生代,在性能上亦更胜一筹。