当前位置:首页 > JavaScript

js实现defer

2026-04-07 02:25:44JavaScript

defer 的实现原理

在 JavaScript 中,defer 通常指延迟执行某些操作,比如延迟加载脚本或延迟执行函数。原生的 HTML <script> 标签支持 defer 属性,但有时需要在纯 JavaScript 中实现类似功能。

使用 setTimeout 实现延迟执行

通过 setTimeout 可以简单实现函数的延迟执行。以下是一个基本示例:

js实现defer

function deferredFunction() {
    console.log('This function is deferred.');
}

setTimeout(deferredFunction, 1000); // 延迟 1 秒执行

封装通用的 defer 函数

可以封装一个通用的 defer 函数,接受回调函数和延迟时间作为参数:

function defer(callback, delay = 0) {
    setTimeout(callback, delay);
}

// 使用示例
defer(() => {
    console.log('Deferred execution after 1 second.');
}, 1000);

结合 Promise 实现异步 defer

如果需要更现代的异步控制,可以结合 PromisesetTimeout

js实现defer

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

// 使用示例
defer(1000).then(() => {
    console.log('Deferred execution after 1 second.');
});

模拟脚本的 defer 属性

如果需要模拟 <script defer> 的行为(即延迟加载但不阻塞 DOM 解析),可以动态创建 <script> 标签并设置 defer 属性:

function loadScriptDeferred(src) {
    const script = document.createElement('script');
    script.src = src;
    script.defer = true;
    document.head.appendChild(script);
}

// 使用示例
loadScriptDeferred('path/to/script.js');

使用 requestAnimationFrame 实现帧级延迟

对于需要与浏览器渲染帧同步的延迟操作,可以使用 requestAnimationFrame

function deferFrame(callback) {
    requestAnimationFrame(callback);
}

// 使用示例
deferFrame(() => {
    console.log('Deferred until next animation frame.');
});

注意事项

  • setTimeout 的延迟时间并非精确,可能会受到浏览器主线程繁忙程度的影响。
  • 使用 Promise 的方案更适合现代异步编程,尤其是与 async/await 结合时。
  • 动态加载脚本时需注意跨域问题和加载顺序依赖。

标签: jsdefer
分享给朋友:

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现tab选项卡切换

js实现tab选项卡切换

实现Tab选项卡切换的JavaScript方法 使用纯JavaScript实现Tab切换功能,可以通过监听点击事件动态切换内容显示状态。以下是两种常见实现方式: 基础DOM操作实现 /…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…