应避免在块级作用域中使用函数声明,因其在旧浏览器中存在提升不确定性;优先采用const函数表达式实现安全、一致的块作用域逻辑。
函数声明在块级作用域中(如 {}、if、for 内)的行为,因 JavaScript 引擎和严格模式差异而不同——ES6 规范明确要求其在块内是**暂时性死区(TDZ)受限的、块作用域的**,但旧版浏览器(如 IE、早期 Safari/Chrome)会将其提升到函数作用域甚至全局,造成意外污染或执行错误。因此,“向前兼容的安全防御脚本”核心不是“让旧环境支持新语法”,而是**规避块级函数声明的不确定性,用确定性语法实现等效逻辑,并安全降级**。
这是最直接、兼容性最好、语义最清晰的替代方案。函数表达式天然具有块作用域,且 const 在所有现代引擎及 Babel 转译后均表现一致:
const myHelper = function() { /* logic */ }; 或带名表达式 const myHelper = function named() { /* logic */ };
var + 函数表达式即使在现代浏览器中开启严格模式,块级函数声明仍存在风险:
(function() { function foo() {} foo(); })();,但不如 const 表达式简洁当逻辑需根据运行时能力分支,且希望函数只在满足条件时存在,可结合特征检测与动态赋值:
if (window.Promise) { function asyncLoad() { ... } }(危险!)const asyncLoad = window.Promise ? function() { /* use Promise */ } : function() { /* fallback to XHR */ };
开发阶段主动拦截风险写法:
@babel/plugin-transform-block-scoping 确保块级 let/const 正确转译(间接保障函数表达式上下文)"no-inner-declarations": ["error", "functions"],直接禁止块内函数声明eslint-plugin-compat 检查 API 兼容性,避免依赖仅新环境才有的函数特性