ontimeupdate,防抖和setTimeOut的区别,防抖和节流
欢迎来到我的博客!
使用 Markdown 格式编写。
今天学到了什么
-
防抖和setTimeOut的区别
-
ontimeupdate
-
节流:等上一个执行完毕后再执行下一个
防抖:等事件停止触发后再执行,执行最后一个,如果一直触发就一直不执行
防抖和setTimeOut的区别
您观察得很敏锐!其实 _.debounce(防抖)的底层核心正是使用了 setTimeout。
虽然感觉差不多,但它们在使用目的和逻辑封装上有很重要的区别:
1. 核心区别:工具 vs. 零件
setTimeout是基础零件:它只是单纯地让代码“等一会儿再执行”。_.debounce是成品工具:它内部封装了setTimeout,并加上了“自动取消上一次等待”的逻辑。
2. 举个“坐电梯”的例子来对比
假设 mouseMove 是电梯关门的动作。
-
只用
setTimeout(延时):- 有人进电梯,虽然你按了“延时5秒关门”。
- 结果:不管这5秒内有没有新的人进来,5秒钟一到,门一定会关。如果第4.9秒进来了人,门还是会夹到他,因为它不管新情况,只管到点执行。
-
用
_.debounce(防抖):- 有人进电梯,系统设定“5秒后关门”。
- 关键点:如果在第 3 秒又进来一个人,
debounce会把之前的计时器作废(clearTimeout),重新开始数 5 秒。 - 结果:只有当最后一个人进来后,干等着过了5秒没人再动了,门才会关。
3. 代码层面的对比
如果您想手写一个防抖功能(不引用 lodash),代码大概长这样,您会发现它就是把 setTimeout 和 clearTimeout 组合起来了:
function myDebounce(fn, delay) { let timer = null; // 用来记录当前的计时器
return function() { // 关键区别在这里! // 每次触发时,先把上一次那个还在等待的 setTimeout 杀掉 if (timer) clearTimeout(timer);
// 然后重新开启一个新的 setTimeout timer = setTimeout(() => { fn(); }, delay); }}总结
您感觉差不多是对的,因为 debounce 就是给 setTimeout 加了一个“撤回重发”的功能。在 mousemove 这种一秒钟触发几十次的事件中,如果只用 setTimeout,虽然会延时,但还是会执行几十次;而用 debounce,它只会执行最后停下来的那一次。
ontimeupdate
你的直觉非常准!它的确是被覆盖了。
你现在的疑惑可能是觉得:
“
video.ontimeupdate难道不是浏览器自带的一个功能吗?如果我给它赋值了,岂不是把浏览器本来处理视频进度的功能给‘删掉’或者‘搞坏’了?”
这里有一个很关键的概念:ontimeupdate 只是一个“空插槽”(或者叫“钩子”)。
1. 本来的样子是 null
在你给它赋值之前,video对象长这样:
console.log(video.ontimeupdate); // 输出 null它默认什么都不是。你可以把它想象成视频播放器上预留的一个空白插座。
- 浏览器的内部逻辑(解码视频、渲染画面、走时间条)是在底层跑的,根本不依赖这个属性。
ontimeupdate的作用:仅仅是浏览器好心留给你的一个窗口 —— “嘿,每当我播放进度变了,如果你在这个插座上插了函数,我就帮你运行一下;如果你没插(是 null),我就继续只管我自己放视频。”
2. 赋值 = 插入你自己的逻辑
当你写:
video.ontimeupdate = _.throttle(...)你并没有覆盖浏览器的内部功能,你只是占据了这个空白插座。
- 以前:进度变了 -> 浏览器看一眼
ontimeupdate-> 是空的 -> 没事发生。 - 现在:进度变了 -> 浏览器看一眼
ontimeupdate-> 发现有个函数(就是那个节流函数) -> 执行它。
3. 如果你多次赋值,那就是覆盖
如果你写了两行:
video.ontimeupdate = functionA;video.ontimeupdate = functionB;那你说的没错,functionA 就彻底没了,被 functionB 覆盖了。因为 ontimeupdate 作为一个对象属性,同一时间只能存一个值。
所以总结一下:
- 确实是覆盖:赋值操作确实覆盖了
ontimeupdate属性当前的值。 - 但没破坏核心:原本它是
null,覆盖它不会影响视频播放,只是告诉浏览器:“进度更新时,请按我的规矩(节流后的规矩)办”。
赞助支持
如果这篇文章对你有帮助,欢迎赞助支持!
部分内容可能已过时