当前位置:首页 > 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 的回调写法。

js实现timeout

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 函数,支持取消。

js实现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 没有这个限制。

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

标签: jstimeout
分享给朋友:

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

利用js实现

利用js实现

使用 JavaScript 实现 在 JavaScript 中,可以通过多种方式实现功能,具体取决于需求。以下是几种常见的方法: 方法一:使用原生 JavaScript // 示例代码…