目录
BOM(浏览器对象模型)
一、window 对象
1. 窗口控制
2. 定时器
二、location 对象
四、history 对象
五、screen 对象
六、本地存储
1. localStorage
2. sessionStorage
七、BOM 应用场景
八、总结
JavaScript 执行机制与事件循环
一、JavaScript 执行上下文(Execution Context)
二、事件循环(Event Loop)机制
三、代码执行顺序示例
四、异步操作分类
1. 宏任务(Macrotasks)
2. 微任务(Microtasks)
五、Node.js 与浏览器的事件循环差异
六、关键总结
BOM(浏览器对象模型)
BOM(Browser Object Model)是浏览器提供的用于与浏览器窗口及环境交互的对象模型。与 DOM(文档对象模型)不同,BOM 的核心对象是
window
,它允许开发者控制浏览器的行为(如导航、历史记录、屏幕信息等)。
一、window
对象
window
是 BOM 的顶层对象,代表浏览器窗口,也是 JavaScript 的全局对象。
1. 窗口控制
方法/属性 | 说明 | 示例 |
---|---|---|
window.innerWidth | 视口宽度(不包含滚动条) | console.log(window.innerWidth) |
window.innerHeight | 视口高度(不包含滚动条) | console.log(window.innerHeight) |
window.open(url, name) | 打开新窗口 | window.open('https://example.com') |
window.close() | 关闭当前窗口(需用户操作触发) | window.close() |
window.resizeTo(w, h) | 调整窗口大小 | window.resizeTo(800, 600) |
2. 定时器
方法 | 说明 | 示例 |
---|---|---|
setTimeout(func, delay) | 延迟执行函数 | setTimeout(() => alert('Hi'), 1000) |
setInterval(func, delay) | 周期性执行函数 | setInterval(updateClock, 1000) |
clearTimeout(id) | 清除延迟任务 | clearTimeout(timerId) |
clearInterval(id) | 清除周期任务 | clearInterval(intervalId) |
二、location
对象
location
包含当前页面的 URL 信息,并允许操作导航。
1. 常用属性
属性 | 说明 | 示例值 |
---|---|---|
location.href | 完整 URL | "https://example.com/path?q=1" |
location.protocol | 协议(http: 、https: ) | "https:" |
location.host | 主机名和端口 | "example.com:8080" |
location.pathname | URL 路径 | "/path" |
location.search | 查询参数(? 后的内容) | "?q=1" |
location.hash | 哈希值(# 后的内容) | "#section" |
2. 常用方法
方法 | 说明 | 示例 |
---|---|---|
location.assign(url) | 加载新页面 | location.assign('new-page.html') |
location.reload() | 重新加载当前页面 | location.reload(true) (强制刷新) |
location.replace(url) | 替换当前页面(无历史记录) | location.replace('login.html') |
三、navigator
对象
navigator
提供浏览器和操作系统的信息。
属性/方法 | 说明 | 示例 |
---|---|---|
navigator.userAgent | 浏览器用户代理字符串 | "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..." |
navigator.platform | 操作系统平台 | "Win32" 、"MacIntel" |
navigator.language | 浏览器首选语言 | "zh-CN" |
navigator.geolocation | 地理位置 API(需用户授权) | navigator.geolocation.getCurrentPosition(...) |
navigator.clipboard | 剪贴板操作(读写文本/图片) | navigator.clipboard.writeText('Hello') |
四、history
对象
history
用于操作浏览器会话历史记录。
方法/属性 | 说明 | 示例 |
---|---|---|
history.length | 历史记录条目数 | console.log(history.length) |
history.back() | 返回上一页(等同用户点击后退) | history.back() |
history.forward() | 前进到下一页 | history.forward() |
history.go(n) | 跳转到历史记录中的第 n 页 | history.go(-2) (后退两页) |
history.pushState() | 添加历史记录(不刷新页面) | history.pushState({}, '', '/new') |
history.replaceState() | 替换当前历史记录(不刷新页面) | history.replaceState({}, '', '/updated') |
五、screen
对象
screen
提供用户屏幕的信息。
属性 | 说明 | 示例 |
---|---|---|
screen.width | 屏幕宽度(像素) | 1920 |
screen.height | 屏幕高度(像素) | 1080 |
screen.availWidth | 可用宽度(排除任务栏等) | 1900 |
screen.availHeight | 可用高度 | 1040 |
screen.colorDepth | 颜色深度(位) | 24 |
六、本地存储
浏览器提供的本地存储 API(属于 BOM 的一部分)。
1. localStorage
-
持久化存储:数据长期保留(除非手动清除)。
-
作用域:同源窗口共享。
-
方法:
localStorage.setItem('key', 'value'); // 存储数据 const value = localStorage.getItem('key'); // 读取数据 localStorage.removeItem('key'); // 删除数据 localStorage.clear(); // 清空所有数据
2. sessionStorage
-
会话级存储:数据在标签页关闭后清除。
-
作用域:仅当前标签页有效。
-
方法:同
localStorage
。
七、BOM 应用场景
-
页面跳转与刷新:
// 跳转到新页面 location.href = 'https://example.com'; // 刷新当前页面 location.reload();
-
浏览器信息检测:
// 判断是否为移动端 const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(navigator.userAgent);
-
历史记录管理:
// 单页应用(SPA)路由控制 history.pushState({ page: 1 }, 'Page 1', '/page1');
-
屏幕适配:
// 根据屏幕宽度调整布局 if (window.innerWidth < 768) {document.body.classList.add('mobile-mode'); }
八、总结
对象 | 核心功能 | 典型用途 |
---|---|---|
window | 窗口控制、定时器、全局对象 | 调整窗口大小、定时任务 |
location | URL 操作与页面导航 | 页面跳转、获取 URL 参数 |
navigator | 浏览器/设备信息 | 设备检测、地理位置获取 |
history | 历史记录管理 | 单页应用路由控制 |
screen | 屏幕信息获取 | 响应式布局适配 |
localStorage | 本地持久化存储 | 用户偏好设置、缓存数据 |
JavaScript 执行机制与事件循环
JavaScript 是单线程语言,但其通过 事件循环(Event Loop) 和 任务队列(Task Queue) 实现了非阻塞异步执行。
一、JavaScript 执行上下文(Execution Context)
-
执行栈(Call Stack)
-
作用:存储函数调用信息(先进后出)。
-
示例:
function a() { b(); } function b() { console.log('Hello'); } a(); // 执行栈顺序:a → b → console.log
-
-
同步任务与异步任务
-
同步任务:立即执行,阻塞后续代码。
-
异步任务:由浏览器/Node.js 的 Web API 处理(如
setTimeout
、fetch
),完成后回调推入任务队列。
-
二、事件循环(Event Loop)机制
1. 事件循环流程
-
步骤:
-
执行同步代码,填充执行栈。
-
遇到异步任务,交给 Web API 处理。
-
执行栈清空后,事件循环检查任务队列。
-
将队列中的回调推入执行栈执行。
-
重复循环。
-
-
可视化流程:
同步代码 → 执行栈 → Web API → 任务队列 → 事件循环 → 执行栈
2. 任务队列类型
队列类型 | 任务类型 | 优先级 |
---|---|---|
微任务队列(Microtask Queue) | Promise.then 、MutationObserver 、queueMicrotask | 高 |
宏任务队列(Macrotask Queue) | setTimeout 、setInterval 、I/O 、UI 渲染 | 低 |
-
执行顺序:
-
执行栈清空后,先清空所有微任务。
-
执行一个宏任务。
-
重复上述过程。
-
三、代码执行顺序示例
console.log('Start');setTimeout(() => console.log('Timeout'), 0);Promise.resolve().then(() => console.log('Promise 1')).then(() => console.log('Promise 2'));console.log('End');
输出顺序:
Start → End → Promise 1 → Promise 2 → Timeout
执行步骤:
-
同步代码依次执行,输出
Start
和End
。 -
setTimeout
回调进入宏任务队列。 -
Promise.then
回调进入微任务队列。 -
同步代码执行完毕,执行所有微任务(
Promise 1
、Promise 2
)。 -
执行下一个宏任务(
Timeout
)。
四、异步操作分类
1. 宏任务(Macrotasks)
-
常见类型:
-
setTimeout
/setInterval
-
I/O 操作(文件读写、网络请求)
-
UI 渲染(浏览器)
-
requestAnimationFrame
(浏览器)
-
-
特点:每次事件循环处理一个宏任务。
2. 微任务(Microtasks)
-
常见类型:
-
Promise.then
/catch
/finally
-
MutationObserver
(浏览器) -
queueMicrotask
-
-
特点:在当前宏任务结束后、下一个宏任务开始前执行所有微任务。
五、Node.js 与浏览器的事件循环差异
环境 | 事件循环阶段 | 微任务执行时机 |
---|---|---|
浏览器 | 简化模型:宏任务 → 微任务 → 渲染 → 宏任务... | 每个宏任务后清空微任务队列 |
Node.js | 分阶段(Timers → Pending → Idle/Prepare → Poll → Check → Close),每阶段执行对应宏任务 | 每个阶段结束后清空微任务队列 |
六、关键总结
-
单线程非阻塞:通过事件循环和任务队列实现异步。
-
任务优先级:微任务 > 宏任务。
-
避免阻塞:长时间同步代码会阻塞事件循环(如大量计算)。
-
应用场景:
-
宏任务:延迟任务、I/O 操作。
-
微任务:高优先级回调(如 Promise)。
-
示例:优化长时间任务
// 将耗时任务拆分为多个微任务
function processChunk(data) {queueMicrotask(() => {// 处理数据块if (data.length > 0) {processChunk(data.slice(100));}});
}
processChunk(largeData);