JavaScript计数器函数返回undefined和NaN问题求助
问题分析与修复
你的代码出现问题的核心原因有三个:
- 每个方法内部都重新声明了
init参数,这会覆盖外部作用域的init变量。调用counter.increment()这类方法时没有传参,导致方法内的init是undefined,对undefined进行自增/自减操作会得到NaN,console.log自然输出undefined。 init++和init--是后置自增/自减运算符,会先返回变量的当前值,再执行递增/递减操作,这不符合你预期的返回init+1或init-1的需求。- 没有保留初始的
init值,当调用increment或decrement修改init后,reset无法回到最初的输入值。
修复后的代码
var createCounter = function(init) { // 保存初始值,用于reset方法 const initialValue = init; return { increment: () => { // 使用前置自增,先递增再返回 return ++init; }, decrement: () => { // 使用前置自减,先递减再返回 return --init; }, reset: () => { // 重置为初始值并返回 init = initialValue; return init; } } }; const counter = createCounter(5) console.log(counter.increment()); // 6 console.log(counter.reset()); // 5 console.log(counter.decrement()); // 4
关键修改点
- 移除每个方法内的
init参数,让方法直接访问外部作用域的init变量。 - 使用前置自增
++init和前置自减--init,确保返回的是修改后的值。 - 新增
initialValue变量保存初始的init值,保证reset方法能正确恢复到初始状态。
内容的提问来源于stack exchange,提问作者Gustavo F. Marcial
相关产品推荐
相关产品推荐

