JavaScript 是单线程语言,事件循环是其实现异步编程的核心机制。
展示事件循环的基本工作原理。
console.log('1');
setTimeout(() => {
console.log('2');
}, 0);
Promise.resolve().then(() => {
console.log('3');
});
console.log('4');
// 输出顺序:
// 1
// 4
// 3
// 2
事件循环由以下几个主要部分组成:
展示事件循环各组成部分的交互。
// 调用栈示例
function first() {
console.log('first');
second();
}
function second() {
console.log('second');
}
first();
// 任务队列示例
setTimeout(() => {
console.log('setTimeout');
}, 0);
// 微任务队列示例
Promise.resolve().then(() => {
console.log('Promise');
});
// 输出顺序:
// first
// second
// Promise
// setTimeout
宏任务包括:script、setTimeout、setInterval、I/O、UI渲染等。
展示宏任务的执行顺序。
console.log('script start');
setTimeout(() => {
console.log('setTimeout');
}, 0);
setInterval(() => {
console.log('setInterval');
}, 1000);
console.log('script end');
// 输出顺序:
// script start
// script end
// setTimeout
// setInterval (每秒执行一次)
微任务包括:Promise、MutationObserver、process.nextTick等。
展示微任务的执行顺序。
console.log('script start');
Promise.resolve().then(() => {
console.log('Promise 1');
}).then(() => {
console.log('Promise 2');
});
console.log('script end');
// 输出顺序:
// script start
// script end
// Promise 1
// Promise 2
事件循环的执行顺序遵循以下规则:
展示事件循环的执行顺序。
console.log('1');
setTimeout(() => {
console.log('2');
Promise.resolve().then(() => {
console.log('3');
});
}, 0);
Promise.resolve().then(() => {
console.log('4');
setTimeout(() => {
console.log('5');
}, 0);
});
console.log('6');
// 输出顺序:
// 1
// 6
// 4
// 2
// 3
// 5
展示嵌套的宏任务和微任务的执行顺序。
展示嵌套任务的执行顺序。
console.log('1');
setTimeout(() => {
console.log('2');
Promise.resolve().then(() => {
console.log('3');
setTimeout(() => {
console.log('4');
}, 0);
});
}, 0);
Promise.resolve().then(() => {
console.log('5');
setTimeout(() => {
console.log('6');
Promise.resolve().then(() => {
console.log('7');
});
}, 0);
});
console.log('8');
// 输出顺序:
// 1
// 8
// 5
// 2
// 3
// 6
// 7
// 4
使用事件循环进行异步编程。
展示异步编程的实际应用。
// 使用 Promise 处理异步操作
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('Data fetched');
}, 1000);
});
}
console.log('Start');
fetchData()
.then(data => {
console.log(data);
return 'Processed ' + data;
})
.then(processedData => {
console.log(processedData);
})
.catch(error => {
console.error('Error:', error);
});
console.log('End');
// 输出顺序:
// Start
// End
// Data fetched
// Processed Data fetched
利用事件循环进行性能优化。
展示性能优化的实际应用。
// 使用 requestAnimationFrame 优化动画
function animate() {
const element = document.getElementById('box');
let position = 0;
function step() {
position += 1;
element.style.left = position + 'px';
if (position < 100) {
requestAnimationFrame(step);
}
}
requestAnimationFrame(step);
}
// 使用 setTimeout 实现节流
function throttle(func, limit) {
let inThrottle;
return function() {
const args = arguments;
const context = this;
if (!inThrottle) {
func.apply(context, args);
inThrottle = true;
setTimeout(() => inThrottle = false, limit);
}
};
}
// 使用示例
const throttledScroll = throttle(() => {
console.log('Scroll event');
}, 1000);
window.addEventListener('scroll', throttledScroll);
建议按照章节顺序学习,每完成一个练习后再进行下一个。可以通过实际项目来实践所学知识,特别是异步编程和性能优化部分。