Safari与WebKit环境下异步匿名函数执行差异问题咨询
异步函数跨浏览器执行差异结论
该现象属于Safari内置JavaScriptCore引擎的实现Bug,不符合ECMAScript规范要求。
差异产生原因
- ES规范明确规定:函数形参与函数内部同名
var声明的变量共享同一作用域绑定,变量提升阶段仅标记变量存在,不会覆盖已完成初始化的形参值。 - 普通同步函数的作用域初始化逻辑在所有浏览器中都符合规范,问题仅出现在Safari对异步函数的作用域处理流程中:Safari错误地在异步函数执行初期先将内部
var声明的同名变量赋值为undefined,直接覆盖了传入的形参值,导致首次打印输出undefined。
复现验证
使用同步函数测试时,所有浏览器输出完全一致,可确认是异步函数实现问题:
(function(v) { console.log(v) var v = v || '#'; console.log(v) })('@') // 统一输出: // '@' // '@'
规避方案
- 避免在函数内部声明与形参同名的
var变量,改用let/const声明不同名的业务变量即可彻底规避该问题 - 若特殊场景必须使用同名变量,可将变量赋值逻辑前置到函数最顶部,避免在声明前调用同名标识符
内容的提问来源于stack exchange,提问作者YanAlex
相关产品推荐
相关产品推荐

