一、nextTick用法
①使用Vue.js时遇到了异步更新DOM的问题;
②在某个特定场景下需要确保DOM已经更新后再执行某些操作;
场景:在修改数据后立即操作DOM元素,但发现数据变化后DOM还没更新,这时候就需要用到nextTick了。
原理:nextTick 是 Vue.js 的核心 API 之一,用于处理 DOM 更新时机问题。它的核心作用是:在 Vue 完成数据更新后,等待 DOM 更新完成时触发回调。
二、setTimeout
场景:
(1)延迟操作:如页面加载后延迟显示弹窗 。
(2)函数节流:控制高频事件(如滚动)的触发频率。
(3)异步任务调度:配合事件循环机制管理代码执行顺序
原理:setTimeout() 是 JavaScript 中用于延迟执行代码或函数的定时器方法。
function:必需。要执行的函数或代码块。可以是:
①匿名函数:setTimeout(() => { /* 代码 */ }, delay);
②命名函数:setTimeout(myFunction, delay);
③字符串代码(不推荐):setTimeout(“alert(‘Hello’)”, delay);
delay:可选。延迟时间(毫秒),默认值为 0,表示立即将任务加入队列,但不保证立即执行 。
param1, param2, …:可选。传递给函数的额外参数(IE9 及更早版本不支持此特性)
function greet(name, role) {
console.log(`Hello ${name}, you are a ${role}!`);
}
setTimeout(greet, 1000, "Alice", "Developer");
取消定时器:使用 clearTimeout(timeoutID),可阻止未执行的定时任务
const timerId = setTimeout(() => {}, 1000);
clearTimeout(timerId);
异步执行
:setTimeout 是异步方法,即使延迟为 0,回调函数也会被放入任务队列,等待当前执行栈清空后才执行
setTimeout(() => { console.log(1); }, 0);
console.log(2); // 输出顺序:2 → 1
三、setInterval
原理:setInterval 是 JavaScript 中用于周期性执行代码的定时器函数
setInterval((a, b) => console.log(a + b), 1000, 1, 2); // 输出 3 三次/秒
时间精度限制:
delay 参数会被转换为 32 位整数,最大值约为 24.8 天(2147483647 毫秒),超过此值可能导致意外行为 。
停止定时器:
const intervalId = setInterval(() => {}, 1000);
clearInterval(intervalId); // 正确
// 或 clearTimeout(intervalId); // 技术上可行,但不推荐
与 setTimeout 的核心区别:
(1)执行次数
setInterval:循环执行,按照固定时间间隔重复调用函数或代码,直到被 clearInterval 显式停止或窗口关闭 3 6 7。
setTimeout:单次执行,仅在指定延迟后执行一次函数,若需重复需通过递归调用自身实现 6 8。
(2)时间间隔控制
setInterval:每次执行的间隔是固定的,但如果函数执行时间超过间隔时间,会导致多个任务堆积(例如,间隔 1 秒的函数执行需 1.5 秒,后续任务会立即执行)。
setTimeout 递归:通过递归调用可确保每次执行的间隔是“延迟时间 + 函数执行时间”,避免任务堆积,更适用于需要严格间隔的场景(如轮询)。
(3)应用场景
setInterval:适合周期性且执行时间较短的任务(如实时更新时钟)。
setTimeout:适合单次延迟任务,或需要动态调整间隔的循环任务(如网络轮询)
setInterval 的潜在问题:
任务堆积:若函数执行时间超过间隔时间,可能导致多个未完成的任务同时排队 。
内存泄漏:未正确使用 clearInterval 停止定时器时,可能导致回调函数持续占用内存 。
全局作用域问题:回调函数中的 this 默认指向全局对象(如 window),而非定义时的上下文。需通过闭包或 bind 方法绑定上下文。