<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>WebWorker on Last Stand</title><link>https://amatsuzero.github.io/LastStand/tags/webworker/</link><description>Recent content in WebWorker on Last Stand</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 08 Nov 2024 00:00:00 +0800</lastBuildDate><atom:link href="https://amatsuzero.github.io/LastStand/tags/webworker/index.xml" rel="self" type="application/rss+xml"/><item><title>WebWorker</title><link>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/webworker/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0800</pubDate><guid>https://amatsuzero.github.io/LastStand/posts/frontend/javascript/webworker/</guid><description>&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;先来聊聊单线程的Javascript&lt;/p&gt;
&lt;p&gt;众所周知，js最初设计是运行在浏览器中的，为了防止多个线程同时操作DOM，带来渲染冲突问题，所以js执行器被设计成单线程。但随着前端技术的发展，js能力远不止如此，当我们遇到需要大量计算的场景时（比如图像处理、视频解码等），js线程往往会被长时间阻塞，甚至造成页面卡顿，影响用户体验。为了解决单线程带来的这一弊端，Web Worker 应运而生。&lt;/p&gt;
&lt;h2 id="1-web-worker"&gt;1. Web Worker&lt;/h2&gt;
&lt;h3 id="11-web-worker-是什么"&gt;1.1 &lt;code&gt;Web Worker&lt;/code&gt; 是什么&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Web Worker&lt;/code&gt; 是 HTML5 标准的一部分，这一规范定义了一套 API，允许我们在 js 主线程之外开辟新的 Worker 线程，并将一段 js 脚本运行其中，它赋予了开发者利用 js 操作多线程的能力。&lt;/p&gt;
&lt;p&gt;因为是独立的线程，Worker 线程与 js 主线程能够同时运行，互不阻塞。所以，在我们有大量运算任务时，可以把运算任务交给 Worker 线程去处理，当 Worker 线程计算完成，再把结果返回给 js 主线程。这样，js 主线程只用专注处理业务逻辑，不用耗费过多时间去处理大量复杂计算，从而减少了阻塞时间，也提高了运行效率，页面流畅度和用户体验自然而然也提高了。&lt;/p&gt;
&lt;h3 id="12-web-worker-能干些什么"&gt;1.2 &lt;code&gt;Web Worker&lt;/code&gt; 能干些什么&lt;/h3&gt;
&lt;p&gt;虽然 Worker 线程是在浏览器环境中被唤起，但是它与当前页面窗口运行在不同的全局上下文中，我们常用的顶层对象 &lt;code&gt;window&lt;/code&gt;，以及 &lt;code&gt;parent&lt;/code&gt; 对象在 Worker 线程上下文中是不可用的。另外，在 Worker 线程上下文中，操作 DOM 的行为也是不可行的，&lt;code&gt;document&lt;/code&gt;对象也不存在。但是，&lt;code&gt;location&lt;/code&gt;和&lt;code&gt;navigator&lt;/code&gt;对象可以以可读方式访问。除此之外，绝大多数 Window 对象上的方法和属性，都被共享到 Worker 上下文全局对象 &lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/WorkerGlobalScope"&gt;WorkerGlobalScope&lt;/a&gt; 中。同样，Worker 线程上下文也存在一个顶级对象 &lt;code&gt;self&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;详细信息请参考：&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers"&gt;Functions and classes available to Web Workers&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="2-web-worker-使用"&gt;2. Web Worker 使用&lt;/h2&gt;
&lt;h3 id="21-创建-worker"&gt;2.1 创建 &lt;code&gt;worker&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;创建 &lt;code&gt;worker&lt;/code&gt; 只需要通过 &lt;code&gt;new&lt;/code&gt; 调用 &lt;code&gt;Worker()&lt;/code&gt; 构造函数即可，它接收两个参数&lt;/p&gt;</description></item></channel></rss>