这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战
工作者线程
JavaScript环境实际上是运行在托管操作系统中的虚拟环境,当我们每打开一个浏览器页面都会有自己的环境,而且各个页面不会互相影响,这样每个页面都有自己的事件和内容。工作者线程和线程确实有很多共同之处,例如工作者线程并行执行、工作者线程不一定在同一个进程里、创建工作者线程的开销更大、工作者线程不共享全部内存、工作者线程可以共享某些内存、工作者线程是以实际线程实现的。但是不建议大量使用工作者线程。
有三种主要的工作者线程:专用工作者线程、共享工作者线程和服务工作者线程。
WorkerGlobalScope
WorkerGlobalScope相关属性和方法,navigator:返回与工作者线程关联的 WorkerNavigator。console:返回与工作者线程关联的 Console 对象;对 API 没有限制。self:返回 WorkerGlobalScope 对象。location:返回与工作者线程关联的 WorkerLocation。origin:返回 WorkerGlobalScope 的源。isSecureContext:返回布尔值,表示工作者线程上下文是否安全。indexedDB:返回 IDBFactory 对象。performance:返回(只包含特定属性和方法的)Performance 对象。caches:返回与工作者线程关联的 CacheStorage 对象;对 API 没有限制。
创建工作者线程
创建工作者最常用的方式是加载JavaScript,把文件路径提供给 Worker 构造函数,然后构造函数再在后台异步加载脚本并实例化工作者线程。
zssWorker.js
// 空的 JS 工作者线程文件
console.log(location.href); // "https://www.baidu.com/"
const test1 = new Worker(location.href + 'zssWorker.js');
console.log(test1); // Worker {}
其中zssWorker.js 文件是从绝对路径加载的。工作者线程本身存在于一个独立的 JavaScript 环境。
Worker 对象支持下列事件处理程序属性。onerror:在工作者线程中发生 ErrorEvent 类型的错误事件时会调用指定给该属性的处理程序。onmessage:在工作者线程中发生 MessageEvent 类型的消息事件时会调用指定给该属性的处理程序。onmessageerror:在工作者线程中发生 MessageEvent 类型的错误事件时会调用指定给该属性的处理程序。postMessage():用于通过异步消息事件向工作者线程发送信息。terminate():用于立即终止工作者线程。没有为工作者线程提供清理的机会,脚本会突然停止。
Worker()构造函数允许将可选的配置对象作为第二个参数, 其中type表示加载脚本的运行方式,可以是classic或module。classic将脚本作为常规脚本来执行,module将脚本作为模块来执行。name表示可以在工作者线程中通过self.name读取到的字符串标识符。credentials在type为module时,指定如何获取与传输凭证数据相关的工作者线程模块脚本。值可以是omit、same-orign或include。