创建函数前检测函数是否存在?遇变量提升问题求解
问题描述
我尝试验证函数是否已存在,以避免创建同名新函数:
// 创建前检测函数是否存在 alert (typeof window.testfunc) // 创建前本应弹出"undefined" function testfunc(){ // 执行操作 } // 创建后检测函数是否存在 alert (typeof window.testfunc) // 创建后应弹出"function"
但即使在定义函数前执行alert,也始终弹出"function"。我尝试在创建函数前执行console.log(window),发现该函数已存在于window对象中。
我忽略了什么?如何在创建新函数前检测函数是否已存在?
原因与解决方案
问题根源
这是JavaScript的**变量提升(Hoisting)**特性导致的:用function关键字声明的函数,会被JS引擎提前“提升”到当前作用域的最顶部。哪怕你把函数写在代码的后面,解析器也会先处理这个函数声明,所以在你执行前面的检测代码时,testfunc已经被挂载到window对象上了,自然会返回"function"。
可行的解决方法
你后来尝试的写法是有效的,因为if语句块内的函数声明不会被提升到全局作用域顶部(不同JS引擎处理细节略有差异,但这种写法能规避提前提升的问题):
alert (typeof window.testfunc) // 现在弹出"undefined" if (typeof window.testfunc !== "function"){ function testooo(){ } } alert (typeof window.testfunc) // 正常弹出"function"
另外,更稳妥的方式是使用函数表达式,因为函数表达式不会被提升,能确保检测逻辑完全符合预期:
alert(typeof window.testfunc); // 弹出"undefined" if (typeof window.testfunc !== "function") { window.testfunc = function() { // 执行操作 }; } alert(typeof window.testfunc); // 弹出"function"
内容的提问来源于stack exchange,提问作者codeispoetry
相关产品推荐
相关产品推荐

