1. 什么是浏览器内核?
* 支持浏览器运行的最核心的程序
2. 不同的浏览器可能不太一样
* Chrome, Safari: webkit
* firefox: Gecko
* IE: Trident
* 360,搜狗等国内浏览器: Trident + webkit
3. 内核由很多模块组成
在主线程运行的模块:
*js引擎模块 : 负责js程序的编译与运行
* html,css文档解析模块 : 负责页面文本的解析
* dom/css模块 : 负责dom/css在内存中的相关处理
* 布局和渲染模块 : 负责页面的布局和效果的绘制
* 布局和渲染模块 : 负责页面的布局和效果的绘制
在分线程运行的模块:
* 定时器模块 : 负责定时器的管理
* 网络请求模块 : 负责服务器请求(常规/Ajax)
* 事件响应模块 : 负责事件的管理
问题一:定时器真是定时执行的吗
先看一个例子:
<script type="text/javascript">
document.getElementById('btn').onclick = function () {
var start = Date.now()
console.log('启动定时器')
setTimeout(function () {
console.log('定时器执行了: ', Date.now()-start)// 861
}, 100)
//定时器启动之后做一个长时间的工作
for (var i = 0; i < 1000000000; i++) {
}
console.log('完成长时间工作', Date.now()-start) // 864
}
</script>
输出顺序:启动定时器-->完成长时间工作 861-->定时器执行了: 864
从结果中可以看出,定时器不是在100后执行的。
因为js是单线程的,定时器中的回调函数只有在运行栈中的代码全部执行完后才有可能执行,setTimeout()的回调函数也是在主线程执行的
问题二:为什么js要用单线程模式, 而不用多线程模式?
* JavaScript的单线程,与它的用途有关。
* 作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。
* 这决定了它只能是单线程,否则会带来很复杂的同步问题
4、 js代码的分类:
- 初始化代码
- 回调代码
5、js引擎执行代码的基本流程
1.先从上到下执行初始化代码: 包含一些特别的代码
* 设置定时器
* 绑定监听
* 发送ajax请求
2.后面在某个时刻才会执行回调代码