当前位置:首页 > JavaScript

js实现timeout

2026-03-13 21:28:47JavaScript

实现 setTimeout 的基本用法

在 JavaScript 中,setTimeout 用于在指定的延迟时间后执行一次函数。基本语法如下:

setTimeout(function, delay, [arg1], [arg2], ...);

其中 function 是要执行的函数,delay 是延迟的毫秒数,可选参数 arg1, arg2 等会传递给函数。

setTimeout(() => {
  console.log('This message appears after 2 seconds');
}, 2000);

清除 setTimeout

setTimeout 返回一个定时器 ID,可以用于取消尚未执行的定时任务。

const timerId = setTimeout(() => {
  console.log('This will not run');
}, 1000);

clearTimeout(timerId);

传递参数给回调函数

可以通过 setTimeout 的额外参数将数据传递给回调函数。

setTimeout((message) => {
  console.log(message); // Outputs: "Hello after 3 seconds"
}, 3000, 'Hello after 3 seconds');

使用箭头函数简化代码

箭头函数可以简化 setTimeout 的回调写法。

setTimeout(() => console.log('Simplified with arrow function'), 1500);

递归实现间隔执行

虽然 setInterval 更适合间隔执行,但 setTimeout 也可以通过递归实现类似效果。

function repeatEverySecond() {
  console.log('Recursive timeout at', new Date().toLocaleTimeString());
  setTimeout(repeatEverySecond, 1000);
}
repeatEverySecond();

处理 this 绑定问题

当使用对象方法作为回调时,需要注意 this 的绑定问题。

const obj = {
  value: 10,
  showValue() {
    console.log(this.value); // Without bind, this would be undefined
  }
};

// 错误方式
setTimeout(obj.showValue, 1000); // Outputs: undefined

// 正确方式
setTimeout(obj.showValue.bind(obj), 1000); // Outputs: 10

实现带取消功能的 timeout

可以封装一个更可控的 timeout 函数,支持取消。

function cancellableTimeout(fn, delay) {
  const timerId = setTimeout(fn, delay);
  return {
    cancel: () => clearTimeout(timerId)
  };
}

const task = cancellableTimeout(() => {
  console.log('Executed after delay');
}, 2000);

// 如果需要取消
// task.cancel();

使用 Promise 封装 setTimeout

可以将 setTimeout 封装成 Promise,便于在异步流程中使用。

function delay(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function run() {
  console.log('Start');
  await delay(1000);
  console.log('After 1 second');
}
run();

实现精确延迟

由于 JavaScript 是单线程的,长时间运行的代码可能会延迟 setTimeout 的执行。

const start = Date.now();
setTimeout(() => {
  const end = Date.now();
  console.log(`Actual delay: ${end - start}ms`); // 可能大于设置的延迟
}, 100);

// 模拟长时间运行的任务
for (let i = 0; i < 1000000000; i++) {}

浏览器与 Node.js 的差异

在浏览器中,最小延迟通常为 4ms(根据 HTML5 规范),而 Node.js 没有这个限制。

js实现timeout

// 在浏览器中,以下代码的实际延迟至少为 4ms
setTimeout(() => {
  console.log('Browser minimum delay');
}, 0);

标签: jstimeout
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…