JavaScript
线程机制与事件机制process
)windows
任务管理器查看进程。thread
)CPU
的最小调度单元。thread pool
):保存多个线程对象的容器,实现线程对象的反复利用。(1)何为多进程与多线程?javascript
(2)比较单线程与多线程?css
多线程html
CPU
的利用率。缺点:java
单线程web
(3)JS
是单线程仍是多线程?ajax
JS
是单线程运行的。H5
中的 Web Workers
能够多线程运行。(4)浏览器运行是单线程仍是多线程?编程
(5)浏览器运行是单进程仍是多进程?windows
有的是单进程:跨域
Firefox
IE
有的是多进程:浏览器
Chrome
Firefox
IE
如何查看浏览器是不是多进程运行的呢?
(1)浏览器内核是支撑浏览器运行的最核心的程序。
(2)不一样的浏览器内核不同:
Chrome
,Safari
:webkit
Firefox
:Gecko
IE
:Trident
360
,搜狗等国内浏览器:Trident+webkit
(3)内核由不少模块组成:
主线程
js
引擎模块:负责js
程序的编译与运行。html
,css
文档解析模块:负责页面文本的解析。DOM/CSS
模块:负责DOM/CSS
在内存中的相关处理。分线程
DOM
事件响应模块:负责事件的管理。ajax
)。(1)定时器真是定时执行的吗?
<button id="btn">启动定时器</button> document.getElementById('btn').onclick = function () { var start = Date.now() console.log('启动定时器前...') setTimeout(function () { console.log('定时器执行了', Date.now()-start) }, 200) console.log('启动定时器后...') }
给上面回调函数加一个长时间的任务:
document.getElementById('btn').onclick = function () { var start = Date.now() console.log('启动定时器前...') setTimeout(function () { console.log('定时器执行了', Date.now()-start) }, 200) console.log('启动定时器后...') // 作一个长时间的工做 for (var i = 0; i < 1000000000; i++) {} }
结果:
同步任务执行完以后才会执行异步任务。
(2)定时器回调函数是在分线程执行的吗?
js
是单线程的。(3)定时器是如何实现的?
JS
是单线程执行的(1)如何证实js
执行是单线程的?
setTimeout()
的回调函数是在主线程执行的。(2)为何js
要用单线程模式, 而不用多线程模式?
JavaScript
的单线程,与它的用途有关。JavaScript
的主要用途是与用户互动,以及操做DOM
。(3)代码的分类:
(4)js
引擎执行代码的基本流程
先执行初始化代码: 包含一些特别的代码 ,回调函数(异步执行)
ajax
请求(1)执行栈
execution stack
(2)浏览器内核
browser core
js
引擎模块(在主线程处理)(3)任务队列(callback queue
)
task queue
(4)消息队列(callback queue
)
message queue
(5)事件队列(callback queue
)
event queue
(6)事件轮询
event loop
(7)事件驱动模型
event-driven interaction model
(8)请求响应模型
request-response model
(1)全部代码分类:
dom
事件监听, 设置定时器, 发送ajax
请求的代码。(2)js
引擎执行代码的基本流程:
(3)模型的2个重要组成部分:
(4)模型的运转流程:
(a)执行初始化代码, 将事件回调函数交给对应模块管理。
(b)当事件发生时, 管理模块会将回调函数及其数据添加到回调列队中。
(c)只有当初始化代码执行完后(可能要必定时间), 才会遍历读取回调队列中的回调函数执行。
H5 Web Workers
(多线程)Web Workers
是 HTML5
提供的一个Javascript
多线程解决方案。Web Worker
运行而不冻结用户界面。DOM
。因此,这个新标准并无改变JavaScript
单线程的本质相关API
Worker
: 构造函数, 加载分线程执行的js
文件。Worker.prototype.onmessage
: 用于接收另外一个线程的回调函数。Worker.prototype.postMessage
: 向另外一个线程发送消息。JS
文件var onmessage = function (event){ //不能用函数声明 console.log('onMessage()22'); var upper = event.data.toUpperCase();//经过event.data得到发送来的数据 postMessage( upper );//将获取到的数据发送回主线程 }
JS
中发消息并设置回调//建立一个Worker对象并向它传递将在新线程中执行的脚本的URL var worker = new Worker("worker.js"); //接收worker传过来的数据函数 worker.onmessage = function (event) { console.log(event.data); }; //向worker发送数据 worker.postMessage("hello world");
编程实现斐波那契数列(Fibonacci sequence)的计算 F(0)=0,F(1)=1,..... F(n)=F(n-1)+F(n-2)
var fibonacci =function(n) { return n <2 ? n : fibonacci(n -1) + fibonacci(n -2); }; console.log(fibonacci(48));
使用Web Workers
在分线程:
var worker = new Worker('worker2.js'); worker.addEventListener('message', function (event) { var timer2 = new Date().getTime(); console.log('结果:' + event.data, '时间:' + timer2, '用时:' + ( timer2 - timer )); }, false); var timer = new Date().getTime(); console.log('开始计算: ', '时间:' + timer); setTimeout(function () { console.log('定时器函数在计算数列时执行了', '时间:' + new Date().getTime()); }, 1000); worker.postMessage(40); console.log('我在计算数列的时候执行了', '时间:' + new Date().getTime());
var fibonacci =function(n) { return n <2 ? n : fibonacci(n -1) + fibonacci(n -2); }; var onmessage = function(event) { var n = parseInt(event.data, 10); postMessage(fibonacci(n)); };
JS
。worker
内代码不能访问DOM
(更新UI
)。