JavaScript系列(23)--事件循环机制详解

JavaScript事件循环机制详解 🔄

今天,让我们深入探讨JavaScript的事件循环机制。事件循环是JavaScript实现异步编程的核心机制,理解它对于编写高性能的JavaScript代码至关重要。

事件循环基础概念 🌟

💡 小知识:JavaScript是单线程的,但通过事件循环机制,它能够处理异步操作而不会阻塞主线程。事件循环由调用栈、任务队列(宏任务)和微任务队列组成。

事件循环的核心组件 📊

// 1. 调用栈示例
function stackDemo() {
   
    function multiply(a, b) {
   
        return a * b;
    }
    
    function square(n) {
   
        return multiply(n, n);
    }
    
    function printSquare(n) {
   
        const result = square(n);
        console.log(result);
    }
    
    printSquare(5);  // 调用栈: printSquare -> square -> multiply
}

// 2. 宏任务和微任务
function taskDemo() {
   
    // 宏任务
    setTimeout(() => {
   
        console.log('Timeout 1');
        // 微任务
        Promise.resolve().then(() => {
   
            console.log('Promise 2');
        });
    }, 0);
    
    // 微任务
    Promise.resolve().then(() => {
   
        console.log('Promise 1');
        // 宏任务
        setTimeout(() => {
   
            console.log('Timeout 2');
        }, 0);
    });
    
    console.log('Main script');
}
// 输出顺序:
// Main script
// Promise 1
// Timeout 1
// Promise 2
// Timeout 2

// 3. requestAnimationFrame示例
function animationDemo() {
   
    let start = null;
    
    function animate(timestamp) {
   
        if (!start) start = timestamp;
        const progress = timestamp - start;
        
        // 执行动画
        document.querySelector('.box').style.transform = 
            `translateX(${
     Math.min(progress / 10, 200)}px)`;
            
        if (progress < 2000) {
   
            requestAnimationFrame(animate);
        }
    }
    
    requestAnimationFrame(animate);
}

事件循环的高级特性 🚀

// 1. 自定义事件循环实现
class SimpleEventLoop {
   
    constructor() {
   
        this.macroTaskQueue = [];
        this.microTaskQueue = [];
        this.running = false;
    }
    
    addMacroTask(task) {
   
        this.macroTaskQueue.push(task);
        this.run();
    }
    
    addMicroTask(task) {
   
        this.microTaskQueue.push(task);
    }
    
    async run() {
   
        if (this.running) return;
        this.running = true;
        
        while (this.macroTaskQueue.length || this.microTaskQueue.length) {
   
            // 执行所有微任务
            while (this.microTaskQueue.length) {
   
                const microTask = this.microTaskQueue.shift();
                try {
   
                    await microTask();
                } catch (error) {
   
                    console.error</
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值