javascript 中函数声明存在变量提升(hoisting),导致 `typeof` 检测在声明前就返回 `”function”`;真正可靠的运行时检测需结合作用域控制与严格模式,而非依赖条件声明。
在 JavaScript 开发中,试图通过 typeof window.xxx === ‘function’ 判断全局函数是否已存在,再决定是否定义新函数——这一做法看似合理,实则隐藏严重陷阱。根本原因在于 函数声明的提升机制:无论 function testfunc() {…} 出现在代码的哪一行,JavaScript 引擎都会在执行前将其“提升”到当前作用域顶部,并初始化为 undefined(在非严格模式下)或直接绑定(在严格模式下)。因此,以下代码:
console.log(typeof testfunc); // "function"(非严格模式下)或 ReferenceError(严格模式下)
function testfunc() {}
即使 console.log 写在 function 前,也会输出 “function” —— 这并非函数已定义,而是声明已被提升。
⚠️ 更危险的是你发现的“条件声明”写法: