关于h.hj=h.hj||function(){...}语法的作用、名称及写法疑问
代码
h.hj=h.hj||function(){ (h.hj.q=h.hj.q||[]).push(arguments) };解析 一、核心语法名称
这是JavaScript里的**短路求值(Short-circuit Evaluation)**结合条件赋值的写法,属于前端脚本中常用的「幂等初始化」模式。
二、代码作用
这段代码的核心是给h.hj做幂等性初始化:
- 如果
h.hj已经存在(为有效值,非undefined/null/false等假值),直接保留原有值,不做任何修改 - 如果
h.hj不存在或为假值,就将其赋值为一个匿名函数——这个函数会维护一个调用队列h.hj.q,每次调用h.hj(...)时,会把传入的所有参数推入该队列。
三、h.hj=h.hj在或条件前的用途
看似重复的赋值,实则是为了明确语义+利用短路特性:
- 短路求值规则是:
a||b中若a为真,直接返回a,不会执行b。这里的h.hj=h.hj把原有h.hj作为左操作数,确保当它有效时,直接保留原值,跳过右侧的函数定义 - 写法上比ES2020新增的
h.hj||=function(...)兼容性更好,同时语义更直白——一眼就能看出是「优先保留原有值,没有才赋值新内容」,避免歧义。
四、设计目的与写法原因
- 防止重复初始化:这类代码常见于第三方统计、埋点脚本,确保即使脚本被多次引入,
h.hj也不会被反复覆盖,保护已有的调用队列或功能逻辑 - 实现延迟调用队列:当核心功能脚本还未加载完成时,提前调用
h.hj()的请求会被存入h.hj.q队列,等核心脚本就绪后,可批量执行这些延迟调用,不会丢失请求 - 简洁性与兼容性:用短路求值替代
if(!h.hj){...}的条件判断,代码更紧凑;同时兼容所有旧版JavaScript环境,无需依赖ES6+新语法 - 幂等性保障:无论执行多少次这段代码,结果都一致,不会因重复执行导致逻辑异常
内容的提问来源于stack exchange,提问作者Sanath Shetty
相关产品推荐
相关产品推荐

