【搞发🌸活】不信书上那套理论!亲测Javascript能卡浏览器Reader一辈子~

作者:大怪v日期:2025/10/16

点进来的前端佬,先别走!

让我详细给你逼逼叨!

93B1A00879A9B67271080936B8A2D89CE1D69417_size242_w423_h220.gif

在很久很久以前,前端圈就广泛流传,Javascript的加载和执行,都会阻塞浏览器Render。

然后过了这些日子,作为一名优秀的前端佬的意识爆发。

按照上面的说法,那是不是可以构造一个Javascript程序,让后续的CSS以及HTML文本永远都不能被解析Render到?

喔,觉的挺来劲的,说干就干!

image.png

前言

一开始构建了这么一个HTML,如下:

1<!DOCTYPE html>
2<html>
3<head>
4  <meta charset="UTF-8">
5  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6  <title>demo</title>
7</head>
8<body>
9  <h1 id="start" class="h1-title">开始渲染了</h1>
10  <script>
11    console.log(document.getElementById('start'))
12  </script>
13</body>
14</html>
15<script>
16  // 此处插入代码
17</script>
18<h1 class="h1-title">看到这里就失败了!</h1>
19<style>
20  .h1-title {
21    color: red;
22  }
23</style>
24

预想阻塞js代码会写在script标签里。

以上代码运行后如下:

image.png

以上展示的,因为没有填入代码,符合期望。

这里解释下为什么要将script脚本和h1要放在html之外。

因为根据各个资料上说,浏览器解读HTML文本就是从上往下解析的。当遇到</html>文档结束标签,就会开始生成DOM树+CSSOM树,并开始Render。

那我脑袋一拍,灵光一闪,自以为是的将需要Render的HTML和CSS放在</html>后,期望只Render第一行文字开始渲染了,而第二行文字看到这里就失败了!就永远得不到Render。

开始挑战!!!

方法一 递归

脑子第一个蹦出来的方法,就是用递归,来模拟JavaScript阻塞。

在上面HTML模板中填入如下代码:

1function block() {
2  Math.sqrt(Math.random());
3  block();
4}
5block();
6

结果如下:

image.png

失败了,还在控制器里报了一个错误.RangeError: Maximum call stack size exceeded

oh,shit,明显这里我忽略了一个细节。

大家都知道的,Javascript是单线程运行机制。

而Javascript的函数分为解析和调用。解析有一个入栈的过程,调用有一个出栈过程。当入栈停止后,才会出栈被调用执行。而上面递归代码,构造了一个无限入栈的场景,结果就是直接撑爆内存。

很显然,浏览器识别到这种风险,直接作出报错处理。

失败~继续尝试!

方法二 while死循环

有了JS的单线程执行思路,顺理成章的,就有了使用while死循环,来模拟阻塞。

插入如下代码试一试。

1while (true) {
2  // 持续执行同步任务
3  Math.sqrt(Math.random());
4}
5

效果如下:

image.png

喔!成功了???? ★,°:.☆( ̄▽ ̄)/$:.°★

罗老师.gif

其实并没有~

之所以能有上面的效果,在于我使用了VSCODE中的Live Server插件,并构造了特殊的场景。基本原来就是Live Server是有热更新,我动态插入了</html>之后的代码到文件中。

image.png

究其原因,在现代浏览器中,浏览器有着强大的纠错机制。很多浏览器都不会遇到</html>就停止解析,忽略后续的文本。他们仍然会好心好意的将后续能看懂的文本,插入到<body>里去。

所以实际上,正常的去执行上面构造的代码,只能得到如下效果:

image.png

但现在离成功,也算走了一半!

动态插入的思路,让我想到了第三个方法。

方法三 按钮手动添加代码

这就是构造一个添加按钮,点击之后,动态添加上HTML标签和Script脚本。

初始是这个样子的:

image.png

HTML代码构造如下:

1<!DOCTYPE html>
2<html>
3
4<head>
5  <meta charset="UTF-8">
6  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7  <title>demo</title>
8</head>
9<body>
10  <h1 id="start" class="h1-title">开始渲染了</h1>
11  <button id="execute">添加</button>
12  <script>
13    function sleepBlocking(ms) {
14      const start = Date.now();
15      while (Date.now() - start < ms) {
16        // 什么都不做,纯粹阻塞
17      }
18    }
19    document.getElementById('execute').onclick = () => {
20      now1 = new Date().getTime()
21      // 在前
22      document.getElementById('execute').insertAdjacentHTML('beforebegin', `
23          <h1 class='h1-title'>看到这里就失败了!</h1>
24          <style>
25            .h1-title {
26              color: red;
27            }
28          <\/style>
29        `)
30      // 在后
31      const script = document.createElement("script");
32      // 5秒后执行
33      script.innerHTML = 'sleepBlocking(5000);console.log("休眠后", new Date().getTime() - now1)'
34      console.log('所有脚本添加后', new Date().getTime() - now1)
35      document.body.appendChild(script);
36    }
37  </script>
38</body>
39</html>
40

从上面的代码可以看到,我弄了一个阻塞执行的5秒函数。接下来预期的效果就是:

点击前,先展示黑色的文字开始渲染了

点击添加按钮后,经过5秒后,就会使得所有文字变红,并出现看到这里就失败了!的效果,最终如下图:

image.png

符合预期!!完美~

以上就是整个验证的思路了,个人觉的基本可以回答标题上的问题。Javascript是真的会阻塞浏览器Render!!

另外还有一种思路,就是使用stream来构造一个一直会执行的远程脚本,为避免无聊,这里就不尝试了,都是大差不差的。

如果还能看到这里的前端佬,那我想说在这个尝试的过程还有一个意外,就是我们经常会看到很多技术类文档,解说Event Loop,都会用上宏任务和微任务解释,个人觉的有点牵强不太行。感兴趣接着往下看!

方法四 构造永不结束的“宏任务”?

先贴下Event Loop的一些解释:

  1. 从宏任务的头部取出一个任务执行;
  2. 执行过程中若遇到微任务则将其添加到微任务的队列中;
  3. 宏任务执行完毕后,微任务的队列中是否存在任务,若存在,则挨个儿出去执行,直到执行完毕;
  4. GUI 渲染;
  5. 回到步骤 1,直到宏任务执行完毕;

按照上面思路,是不是我我构造一个永远不结束的宏任务,也可以阻塞Render???

现在我把Javascript代码替换成如下:

1function setTime() {
2  Math.sqrt(Math.random());
3  setTimeout(() => {
4     setTime()
5  }, 1)
6}
7setTime()
8

然后我们看到的效果确实是这样的。

image.png

并没有阻止,定时器任务还在依旧运行代码。

所以,我是不太相信网上那些所谓的事件循环的解释了!

另外我自己去找权威书籍《JavaScript高级程序设计(第4版)》 和 《JavaScript权威指南(第7版)》,英文版本,连那些词都没得~

嗯....先这样吧。

看到这里,我是想说,我这篇表情包很克制了!前端佬们给点小心心吧♥(ˆ◡ˆԅ)

新疆马蹄打了北鼻.gif


【搞发🌸活】不信书上那套理论!亲测Javascript能卡浏览器Reader一辈子~》 是转载文章,点击查看原文


相关推荐


算法刷题-数组篇之螺旋矩阵II(超简单)
destiny_tool2025/10/15

力扣题目链接https://leetcode.cn/problems/spiral-matrix-ii/ 1.1 问题描述: 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。 示例: 输入: 3 输出: [ [ 1, 2, 3 ],                        [ 8, 9, 4 ],                        [ 7, 6, 5 ] ]    1.2 思路: 本题具体考察


Spring Boot 3.x核心特性与性能优化实战
奋斗的小monkey2025/10/14

Spring Boot 3.x核心特性与性能优化实战 前言 随着Java生态的持续演进,Spring Boot 3.x作为最新版本带来了许多重大改进和创新特性。本文将深入探讨Spring Boot 3.x的核心技术亮点,并结合实际案例展示性能优化的最佳实践。 1. 技术栈升级 Spring Boot 3.x正式要求使用JDK 17及以上版本,这标志着Spring框架全面拥抱现代Java特性。 // 传统方式 @Configuration public class AppConfig {


黑马商城微服务项目准备工作并了解什么是微服务、SpringCloud
Le1Yu2025/10/12

目录 一、后端项目的导入以及启动服务的配置 二、前端nginx项目的导入 三、linux虚拟机MySql安装 四、单体架构与微服务         单体架构        :         微服务: 五、SpringCloud 一、后端项目的导入以及启动服务的配置         将资料当中的项目下载下来后用idea打开;按Alt+8打开Services面板,按照指示添加启动项:         找到Spring Boot:         点击后应该


从0到1微调DeepSeek大模型,LoRA+4位量化让24GB显卡也能玩转
陈敬雷-充电了么-CEO兼CTO2025/10/10

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《GPT多模态大模型与AI Agent智能体》(跟我一起学人工智能)【陈敬雷编著】【清华大学出版社】 清华《GPT多模态大模型与AI Agent智能体》书籍配套视频课程【陈敬雷】 文章目录 GPT多模态大模型与AI Agent智能体系列二百一十六从0到1微调DeepSeek大模型,LoRA+4位量化让24GB显卡也能玩转一、为什么要微调DeepSeek?从“通才”到“专家”的蜕变二、微调核心原理:从损失函数到数据策略


基于Hadoop的车辆二氧化碳排放量分析与可视化系统|基于Spark的车辆排放量实时监控与预测系统|基于数据挖掘的汽车排放源识别与减排策略系统
计算机源码社2025/10/9

💕💕作者:计算机源码社 💕💕个人简介:本人八年开发经验,擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等,大家有这一块的问题可以一起交流! 💕💕学习资料、程序开发、技术解答、文档报告 💕💕如需要源码,可以扫取文章下方二维码联系咨询 💕💕Java项目 💕💕微信小程序项目 💕💕Android项目 💕💕Python项目 💕💕PHP项目 💕💕ASP.NET项目 💕�


Flutter 应用生命周期:使用 AppLifecycleListener 阻止应用崩溃
JarvanMo2025/10/8

当我刚开始进行 Flutter 开发时,应用生命周期(App Life Cycle)感觉就像一个神秘的黑盒子。为什么我点击 Home 键时我的计时器会停止?为什么我恢复应用时相机有时会崩溃?朋友们,答案就在于应用生命周期。 欢迎关注我的微信公众号:OpenFlutter,感谢。 作为一名 Flutter 开发者,掌握应用生命周期不仅仅是一个好主意——它是构建专业应用的必不可少的条件。它能让你防止应用崩溃、节省用户的电量,并保护他们宝贵的数据。 本指南将详细解析这些关键状态,并使用 AppLif


Oracle云基础设施强势崛起:AI驱动的新一代云计算竞争格局
qife1222025/10/6

Beyond Stargate: Oracle OCI提升云基础设施吸引力 Oracle与前沿AI模型制造商达成了震撼市场的交易,但专家表示,该公司也加强了对云计算三巨头在企业IaaS领域的挑战。 无论企业AI最终是福音还是泡沫,IT买家现在都需要考虑Oracle云基础设施这个新的主要参与者。Oracle本月频频登上头条,包括9月9日发布的强劲云收入预测,这主要得益于来自前沿模型公司的投资,例如OpenAI和软银的Stargate合资企业,该企业于6月与Oracle签署了4.5吉瓦数据中心协议。


数据仓库和商务智能考试考点及关系梳理
轩哥Up2025/10/5

一、核心考点分类及具体内容 (一)基础定义与核心区别(高频基础考点) 核心定义 概念 核心含义 关键目标 数据仓库(Data Warehouse, DW) 面向主题、集成、稳定、时变的结构化数据存储系统,通过整合多个数据源(OLTP系统、文件、API等)的历史数据,为企业决策提供统一的数据基础 1. 数据整合:消除数据孤岛,形成企业级统一数据视图; 2. 历史存储:保留长期历史数


首屏加载优化总结
excel2025/10/4

一、什么是首屏加载 首屏时间(First Contentful Paint,FCP) :浏览器从输入网址到 首屏内容渲染完成 的时间。 不需要整个网页都渲染完,但首屏区域必须显示内容。 重要性:是衡量用户体验最关键的性能指标之一。 计算方式 监听 DOMContentLoaded document.addEventListener('DOMContentLoaded', () => { console.log('first contentful painting'); });


Android Studio | 设置国内代理(SDK 设置国内代理(阿里云镜像))
指针不南2025/10/2

Android Studio 相关下载设置国内代理(阿里云镜像)(Android Git 仓库 国内代理/阿里云镜像) 简介 Android 上的 Git 存储库。 下载地址 阿里云镜像:https://mirrors.aliyun.com/android.googlesource.com/ 相关链接 官方主页 使用方法 打开设置(settings)。进入“外观与行为”(Appearance & Behavior)。选择“系统设置”(System Settings)。点击“HTT

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0