WebWorker在浏览器中的后台我们都知道JavaScript在执行时是单线程执行的,也就是说一次只能做一件事情,这也是同Thislanguage有很大的关系。它使用同步执行来运行。如果有阻塞,下面的代码将不会执行。HTML5提出了webWorker标准,也就是说JavaScript允许多线程,但是子线程完全在主线程的控制之下,子线程不能操作DOM,只有主线程才能操作DOM,所以单线程基于主线程的线程执行原理已经成为JavaScript语言的核心。进程和线程的区别是根本不同的:进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。操作系统中可以同时运行多个进程(程序);并且多个线程在同一个进程(程序)中同时执行。什么是兼容性WebWorker?简单来说就是在Javascript单线程执行的基础上,在不影响主线程执行的情况下,启动一个子线程来处理程序。子线程执行完后,返回到主线程。不影响主线程的执行过程。举个栗子。传统上,执行以下代码后,整个页面将被冻结。由于javascript是单线程的,下面的代码已经完全阻塞了while(1){}的后续执行。如果我们换个方法,我们通过开启一个新的线程来执行这段代码,放在一个单独的worker.js文件中,在主线程上执行下面的代码,就可以避免这种情况。varworker=newWorker("worker.js")WebWorker的用法决定了当前浏览器是否支持webworkerif(typeof(Worker)!="undefined"){//浏览器是否支持webworkerif(typeof(w)=="undefined"){//w未定义,还没有开始计数w=newWorker("webworker.js");//创建一个Worker对象,使用Worker的构造函数}//onmessage是Worker对象的属性w.onmessage=function(event){//事件处理函数,用于处理后端webworker传递过来的消息//做一些事情};}else{//浏览器不支持webworker//dosomething}API①创建一个新的Workervarworker=newWorker("worker.js")②传参worker.postMessage()③接收消息worker.onMessage=function(msg){}④异常处理worker.onerror=function(err){}⑤结束workerworker.terminate()⑥加载工具类函数importScripts()Workerscope当我们创建一个新的worker时,代码会运行在一个新的javascript环境中(WorkerGlobalScope),这是完全和创建worker脚本隔离的。这时候我们可以把创建新worker的脚本称为主线程,创建的新worker称为子线程。WorkerGlobalScope是worker的全局对象,所以它包含了核心javascript全局对象的所有属性,比如JSON等,window的一些属性也有类似XMLHttpRequest()等的属性,但是我们新建的workerstarted也是一个子线程,不支持对页面DOM的操作。线程之间的通信是传递值而不是地址。主线程和子线程之间有多种数据通信方式。通信内容可以是文本,也可以是对象。需要注意的是,这种通信是一种复制关系,即传递的是值而不是地址,子线程对通信内容的修改不会影响到主线程。实际上,浏览器内部的运行机制是先将通信内容序列化,然后将序列化后的字符串发送给子线程,子线程再进行恢复。JavaScript中的数据类型存储原理和传输规则共享线程(SharedWorker)共享线程是为了避免重复的线程创建和销毁过程,降低系统性能的消耗。共享线程SharedWorker可以同时拥有多个页面的线程链接。使用SharedWorker创建共享线程,还需要提供一个javascript脚本文件的URL地址或者Blob,里面包含了我们需要在线程中执行的代码,如下:varworker=newSharedWorker("sharedworker.js");shared线程也是使用message事件来监听线程消息,但是使用SharedWorker对象的port属性与线程进行通信,如下:worker.port.onmessage=function(msg){};同时我们也可以使用SharedWorker对象的port属性向共享线程发送消息如下:worker.port.postMessage(msg);工作原理生命周期①当一个webworker的文档列表不为空时,这个webworker被称为一个权限线程。②当一个webworker的文档列表中的任何一个对象完全激活时,这个webworker就称为一个需要被激活的线程。③当一个webworker是允许线程并且有一个计数器或者有一个数据库事务或者有一个网络连接或者它的webworker列表不为空时,这个webworker被称为受保护线程。④当一个webworker是一个不需要被激活的线程,同时也是一个被允许的线程时,这个webworker被称为可挂起线程。以webKit为例,加载并执行workers的流程应用:1.可以在不挂起主流程的情况下加载一个JS进行大量复杂的计算,通过postMessage和onmessage进行通信2.可以通过importScripts(url)来加载另一个脚本文件3.可以使用setTimeout()、clearTimeout()、setInterval()和clearInterval()4.可以使用XMLHttpRequest发送请求5.可以访问导航器的一些属性不该做的事情:1.无法跨域加载JS2。Worker代码无法访问DOM3。不同的浏览器有不同的Worker实现。例如,FF允许在worker中创建新的worker,而Chrome则不允许。4.不是每个浏览器都支持这个新特性
