重复声明含默认参数的函数后调用返回NaN的原因咨询
重复声明函数后返回NaN的原因解析
核心逻辑:函数声明的提升与覆盖
JavaScript里函数声明会被提升到当前作用域的最顶部,要是有同名的函数声明,后面的会直接覆盖前面的版本。
你的代码里,虽然带默认参数的函数写在前面,但实际执行时,两个函数声明都会被提升到作用域顶部,最终是后面那个不带默认参数的monitorCount生效,前面带默认值的版本直接被覆盖了。
实际执行顺序拆解
代码实际运行的逻辑等价于下面这样:
// 先提升函数声明,后面的覆盖前面的 function monitorCount(rows,columns){ console.log(typeof rows,typeof columns); return rows*columns; } // 执行原代码里的调用语句 console.log(monitorCount()); // 调用的是无默认参数的版本,rows和columns都是undefined console.log(typeof monitorCount()); // 原第一个带默认参数的函数已经被覆盖,完全不生效
调用monitorCount()时没传参,所以rows和columns都是undefined,undefined * undefined的结果就是NaN。而typeof NaN本身就是number,这就是你看到的现象的原因。
单次声明正常的原因
如果只保留带默认参数的函数,调用monitorCount()时会自动使用默认值rows=5和columns=3,计算5*3=15,自然返回正确结果。
避坑提示
- 别在同一作用域里重复声明同名函数,很容易搞乱代码逻辑。
- 要是需要实现类似“重载”的效果,可以通过判断参数的个数、类型来处理,或者改用函数表达式(比如
const monitorCount = function(rows=5, columns=3) {}),函数表达式不会被提升,也就不会出现被覆盖的问题。
内容的提问来源于stack exchange,提问作者mikeli
相关产品推荐
相关产品推荐

