# addEventListener第三个参数不是只有true和false吗?
第三个参数不只有 true/false,还可以是一个 Options 对象。
# 三种形式
# 1. boolean(旧写法)
window.addEventListener('resize', handler, true) // 捕获阶段
window.addEventListener('resize', handler, false) // 冒泡阶段(默认)
# 2. Options 对象(新写法)
window.addEventListener('resize', handler, {
capture: false, // 等价于 true/false
once: true, // 只触发一次
signal: abortController.signal // 可以通过 abort() 移除监听
})
# 3. 不加第三个参数
window.addEventListener('resize', handler) // 等价于 false
# 您的代码解释
const controller = new AbortController();
window.addEventListener('resize', () => {}, { signal: controller.signal });
controller.abort(); // 这行会移除上面的 resize 监听
优势:相比 removeEventListener 需要保存引用,AbortController 可以在任意时刻取消监听,无需记住原来的 listener 函数。
# 对比
| 方式 | 优点 | 缺点 |
|---|---|---|
removeEventListener | 兼容性好 | 需要保存 listener 引用 |
AbortController | 可随时取消,代码更简洁 | 需要新浏览器支持 |
所以您最初注释掉的那种写法是传统方式,下面的 AbortController 是现代方式,两者都可以。