passive的语义和它的作用之间的关联

本文最后更新于:2025年1月29日 凌晨

passive

从语义角度解释 passive

passive 的字面意思是 “被动的”“不主动干预的”。在事件监听器中,passive 的含义与它的语义高度契合,具体体现为:


1. 被动的监听器

  • 默认行为:浏览器在触发某些事件(如 touchmovescroll)时会等待事件监听器执行完成,以检查是否调用了 preventDefault() 来阻止默认行为。
  • passive: true 的含义:声明监听器是“被动的”,即它不会主动干预或阻止事件的默认行为,浏览器可以直接处理默认行为(如页面滚动)而无需等待。

这样,passive 的语义表现为一种“不干涉”的行为。


2. 对比主动干预(non-passive)

如果没有 passive: true,监听器可能会变成“主动干预者”,即通过调用 preventDefault() 改变事件的默认执行逻辑。此时,浏览器不得不等待监听器执行完,确定是否阻止默认行为。

  • 主动监听器(非 passive:监听器会干预默认行为,例如阻止滚动。
  • 被动监听器(passive:监听器不干预默认行为,例如允许滚动正常发生。

3. 语义的核心:不干预默认行为

passive 的设计初衷就是优化浏览器性能,避免事件监听器主动干预默认行为。因此,从语义上可以将其理解为:

  • “我只是观察事件,不会主动插手。”
  • “浏览器可以自由地处理事件的默认行为。”

这与 “被动” 的定义一致,即仅观察而不采取干预措施。


4. 实际案例中的语义体现

没有 passive(默认情况下)

1
2
3
document.addEventListener('touchmove', function (e) {
e.preventDefault(); // 明确阻止默认行为(滚动)。
}, { passive: false });

这里监听器是“主动的”,会干预触摸事件并阻止页面滚动。

设置 passive: true

1
2
3
document.addEventListener('touchmove', function (e) {
// 不会调用 preventDefault(),只观察,不干预。
}, { passive: true });

这里监听器是“被动的”,不干预触摸事件的默认行为,页面滚动可以正常发生。


5. 总结:语义与作用的契合

  • passive 的语义:表示监听器仅处于“被动观察”的状态,不会主动干预事件的默认行为。

  • 现实中的类比

    • 一个“主动”参与的观察者可能会插手正在发生的事情。
    • 一个“被动”的观察者只记录发生的事情,而不试图改变它。

passive: true 的设计正是基于这种“不干预”的语义逻辑,同时提升了浏览器的性能表现。


passive的语义和它的作用之间的关联
https://hercules11.github.io/blog/2025/01/22/passive的语义和它的作用之间的关联/
作者
wxc
发布于
2025年1月22日
许可协议