JavaScript是否支持函数覆盖?实测同名函数运行疑问
JavaScript中同名函数的覆盖机制解释
你看到的“JavaScript不允许函数覆盖”的说法是不准确的,实际上JavaScript允许同名函数声明互相覆盖,这是语言的标准行为,你的代码运行正常完全符合规范。下面结合你的代码具体解释:
1. 函数声明的提升与覆盖逻辑
在全局作用域或函数作用域中,函数声明会被**提升(Hoist)**到作用域的顶部执行。当存在多个同名的函数声明时,最后一个函数声明会覆盖前面所有的同名声明。
看你的代码:
function getRndInteger(min, max) { return Math.floor(Math.random() * (max - min)) + min; } function getRndInteger(min, max) { return Math.floor(Math.random() * (max - min + 1) ) + min; }
这两个都是函数声明,在代码执行前,JavaScript引擎会先处理所有函数声明:先把第一个getRndInteger挂载到作用域,然后立刻被第二个getRndInteger替换。所以当你后续调用getRndInteger(1,10)和getRndInteger(2,5)时,实际上调用的都是第二个函数,第一个函数已经被完全覆盖,不会被执行。
你可以验证这一点:第一个函数的返回值范围是[min, max)(取不到max),第二个是[min, max](能取到max)。如果你的输出中出现了10(调用1,10时)或5(调用2,5时),就说明确实是第二个函数在起作用。
2. 关于“不允许函数覆盖”的误区
部分人提到的“不允许”,通常是混淆了两种场景:
- let/const声明的函数表达式:如果用
let getRndInteger = function(){};重复声明同名变量,会抛出语法错误,因为let/const不允许同一作用域内重复声明变量。 - 严格模式下的块级作用域函数:ES6后块级作用域(如
if代码块)内的函数声明有特殊处理逻辑,但全局/函数作用域下的函数声明覆盖依然合法。
3. 你的代码为什么能正常运行?
JavaScript对函数声明的覆盖是合法操作,运行时不会抛出错误,只会静默替换前面的函数。你的代码返回状态码0(正常退出)完全符合预期,因为没有语法错误或运行时错误,只是第一个函数被替代了而已。
简单来说:你的代码里并没有“两个同名函数同时运行”,只有最后一个函数在生效,前面的函数已经被覆盖消失了。
内容的提问来源于stack exchange,提问作者Ahmet Gültekin
相关产品推荐
相关产品推荐

