第 3 卷
- 修改宽高(width/height)、内外边距(margin/padding)、边框(border);
- 修改定位(position)、浮动(float)、top/left/right/bottom;
- 修改字体大小(font-size)、行高(line-height)(影响文字排版尺寸);
- 修改 box-sizing、 min-width / max-height 等布局相关属性。
- 浏览器/窗口操作
- 浏览器窗口大小改变(resize事件);
- 页面滚动(部分浏览器对滚动的回流做了优化,仅计算可视区域);
- 浏览器缩放(zoom)。
- 其他强制计算场景
• 调用获取布局属性的API(会强制浏览器立即回流,获取最新值),如:
offsetWidth/offsetHeight、 clientWidth/clientHeight、 scrollWidth/scrollHeight、
getBoundingClientRect()、 getComputedStyle()。
9. 解释什么是重绘(Repaint)以及它在浏览器渲染网页时的作用
重绘(Repaint/Paint)的定义
重绘是浏览器在回流完成后,根据渲染树的样式规则,重新绘制节点的像素内容的过程,仅修改节点的视觉属性(不改变几何位置/尺寸),性能消耗远低于回流。
重绘的核心作用
- 保证页面的视觉效果与样式规则一致,将CSS样式转化为屏幕上的像素点;
- 重绘仅操作画布像素,不涉及布局计算,是渲染流程的最后一步可视化操作;
- 重绘可局部触发,仅绘制修改样式的节点,无需遍历整个渲染树。
触发重绘的场景(核心:修改视觉属性,不改变几何结构)
- 修改颜色(color/background-color/border-color);
- 修改背景(background-image/background-position);
- 修改阴影(box-shadow/text-shadow);
- 修改透明度(opacity)、光标(cursor);
- 修改 visibility:hidden(节点仍占据布局空间,仅隐藏视觉);
- 修改文字装饰(text-decoration)、字体样式(font-style)。
- 重绘:修改视觉属性→仅重新绘制像素→性能消耗小;
- 关系:回流必触发重绘,重绘不一定触发回流。
10. 描述在开发过程中遇到的跨域问题,并解释导致跨域问题产生的原因
开发中常见的跨域问题场景
- AJAX请求跨域:前端通过axios/fetch请求不同域名的接口,控制台报错 No 'Access-
Control-Allow-Origin' header is present on the requested resource;
- 静态资源跨域:加载不同域名的CSS/JS/图片/字体,部分资源(如字体)因浏览器限制触发跨域;
- iframe跨域:父子iframe页面域名不同,无法互相操作DOM/通信;
- LocalStorage/Cookie跨域:不同域名无法共享LocalStorage/Cookie,无法读取对方存储数据;
- WebSocket跨域:WebSocket连接的地址与当前页面域名不同,触发跨域校验。
跨域问题产生的根本原因
跨域的本质是浏览器的同源策略限制,浏览器为了保护用户数据安全,禁止非同源的页面之间进行资源交互和数据通信,当请求的协议、域名、端口三者任意一个与当前页面不一致时,即判定为跨域,
浏览器会拦截请求响应/数据交互。
注:跨域是浏览器的行为,服务器之间的请求不存在跨域限制(如后端接口调用第三方接口)。
- 什么是浏览器的同源策略?为什么浏览器会有同源策略?
同源策略(Same-Origin Policy)的定义
同源策略是浏览器的核心安全机制,规定:只有当两个页面的「协议、域名、端口」完全一致时,才视为同源,同源页面之间可自由进行数据交互和资源访问,非同源则受严格限制。
同源判定示例(以http://www.baidu.com:8080为例)
- ✅ 同源: http://www.baidu.com:8080/index.html(协议/域名/端口一致);
- ❌ 跨域: https://www.baidu.com:8080(协议不同:http→https);
- ❌ 跨域: http://blog.baidu.com:8080(域名不同:www→blog);
- ❌ 跨域: http://www.baidu.com:80(端口不同:8080→80)。
- 防止CSRF跨站请求伪造:避免恶意网站伪造用户请求,向合法网站提交操作(如转账、改密
码);
- 防止DOM劫持:避免非同源页面操作当前页面的DOM结构,篡改页面内容;
- 保护用户隐私数据:隔离不同域名的存储数据、会话信息,避免数据泄露。
同源策略的限制范围
- 禁止AJAX/fetch请求非同源接口;
- 禁止操作非同源iframe的DOM/JS对象;
- 禁止读取非同源的Cookie/LocalStorage/SessionStorage;
- 禁止加载非同源的字体/部分插件资源;
- 禁止WebSocket非同源连接(需服务端允许)。
注:同源策略不限制静态资源(CSS/JS/图片)的加载,仅限制脚本对资源的操作。
12. 解释正向代理和反向代理的概念及其在网络通信中的作用
正向代理(Forward Proxy)
定义
正向代理是客户端的代理,代理服务器位于客户端与目标服务器之间,客户端主动向代理服务器发起请求,代理服务器再转发请求到目标服务器,目标服务器只知道代理服务器的地址,不知道真实客户
端的地址。
核心特征
- 代理服务于客户端,客户端明确知道目标服务器地址;
- 客户端需要手动配置代理地址才能使用;
- 代理服务器隐藏真实客户端IP。
典型应用场景
- 科学上网:突破网络地域限制,访问境外网站;
- 网络加速:代理服务器缓存静态资源,提升访问速度;
- 隐藏客户端IP:保护客户端隐私,避免被目标服务器追踪;
- 企业内网管控:企业通过代理服务器统一管理员工的外网访问。
全站分卷索引 · 10 卷
- 1第 1 卷
- 2第 2 卷
- ◦ 处理样式优先级(!important > 行内样式 > ID选择器 > 类/伪类/属性选择器 > 标签/伪元素选择
- 关键特性
- 6. 详述浏览器加载和执行JavaScript文件的机制
- JS加载执行核心机制(单线程+阻塞特性)
- • 浏览器解析HTML时,遇到 <script> 标签,立即暂停后续HTML解析,发起HTTP请求加载JS文
- • 可通过属性优化加载:
- ◦ async:异步加载,加载完成后立即执行(执行顺序不确定,不阻塞HTML解析,阻塞渲
- ◦ defer:异步加载,HTML解析完成后、DOMContentLoaded事件前执行(执行顺序与标签
- ◦ type="module":ES6模块加载,默认异步,遵循 defer 规则,支持按需加载、作用域隔
- • V8引擎采用即时编译(JIT):将AST转换为字节码,再将热点代码(频繁执行)编译为机器码,
- 关键特性
- • 异步JS(async/defer/module)仅解除对HTML解析的阻塞,仍会阻塞 DOMContentLoaded 事
- 3第 3 卷
- 4第 4 卷
- 5第 5 卷
- 6第 6 卷
- ✅ 2. 微任务的优先级和执行时机不同
- ✅ 3. 宏任务的类型和优先级不同
- ✅ 4. 页面渲染的差异
- • Node.js事件循环:无页面渲染环节,Node.js是服务端运行环境,无需渲染页面,专注于I/O处
- ✅ 5. 异步API的支持差异
- • 浏览器:支持DOM事件、AJAX、requestAnimationFrame、MutationObserver等前端专属异步
- • Node.js:支持文件I/O、网络I/O、child_process、setImmediate、process.nextTick等服务端专
- ✅ 6. 任务队列的数量差异
- ✅ 核心差异总结表
- 17. 描述process.nextTick在Nodejs事件循环中的执行顺序及其与微任务
- 的关系
- process.nextTick的定义
- 7第 7 卷
- 8第 8 卷
- 9第 9 卷
- 10第 10 卷
- • 不再使用的全局变量,手动置空释放:`window.data = null`(浏览器)、`delete global.data`
- • 避免闭包长期引用大对象,若必须引用,业务结束后手动清空闭包引用:`persistentClosure =
- • DOM元素移除前,通过`removeEventListener`移除对应的事件监听(注意:监听函数必须与绑
- • 组件生命周期销毁时(如React的`componentWillUnmount`、Vue的`beforeUnmount`),批
- • 定时器/计时器使用后,务必通过`clearTimeout`/`clearInterval`清理,尤其是在组件销毁、页
- • 将定时器ID存储在实例属性中,便于后续清理:`this.timer = setTimeout(...)`,销毁时执行
- • 避免在JS中长期缓存DOM元素,优先通过`document.querySelector`动态获取,减少不必要的
- • 异步任务(Promise/AJAX)确保完成:无论成功/失败,都调用`resolve/reject`;使用
- • 内存缓存设置上限和过期机制:使用`lru-cache`等成熟缓存库(自动淘汰最近最少使用的缓
- • 优先使用`WeakMap/WeakSet`作为缓存:它们的键是弱引用,当键对应的对象无其他引用时,会
- • 浏览器端:使用Chrome开发者工具(Memory面板),通过HeapSnapshot(堆快照)对比内存
- • Node.js端:使用`--inspect`参数启动服务,通过Chrome开发者工具调试;使用`clinic.js`、