浏览器工作原理

工作过程

image.png

1、用户输入网址
2、浏览器访问DNS服务器,获取网址对应的ip地址
3、浏览器访问ip地址及对应端口(默认http是80,https是443),获取资源
4、服务器返回资源(html、css、js、图片文件等)
5、浏览器内核,解析获取的资源,然后渲染到页面上

浏览器内核(排版引擎、页面渲染引擎)

image.png

浏览器渲染过程

image.png
渲染过程中,如果遇到js代码,会暂停执行html,先执行js代码。

js代码,由js引擎执行。

JS引擎

image.png

image.png

浏览器引擎 and JS引擎

image.png
小程序渲染层
image.png

=========================

V8引擎

定义

image.png
image.png

AST抽象语法树参考网址:https://astexplorer.net/

V8引擎源码:https://github.com/v8/v8

模块介绍

image.png

执行过程

image.png

解析 Parser(早期)

image.png

(1)初始化全局对象 GO

image.png

(2)执行上下文栈(调用栈 ECS)

image.png

image.png

image.png
image.png

(3)执行函数

image.png
image.png

函数调用函数

return

解析 Parser(后期)

image.png
早期的ECMA版本,执行上下文栈会关联一个变量对象(VO),也就是GO,也就是window

而后期ECMA版本,执行上下文栈会关联一个变量环境(VE)
V8引擎实现,就是把所有的变量,放在一个叫Variable_ 的对象里面,类型是VariableMap,实际上在C++是哈希表HashTable。
而window是由浏览器实现的,和变量环境VE是2个不同的变量。只有在声明var变量的时候,才会加到window,这个只是兼容,理论上不应该加到这里。
image.png(源码)

========================

内存管理

介绍

image.png
image.png
image.png

JS的内存管理

image.png
比如对象、数组都是复杂数据类型

JS垃圾回收

image.png

1、引用计数

image.png
image.png
image.png

2、标记清除

image.png

========================

闭包与内存管理

image.png

高阶函数

高阶函数: 一个函数(如下calc、foo、makeAdder)如果接受另外一个函数作为参数(如下形参calcFn),或者该函数会返回另外一个函数(如下bar、add)作为返回值的函数

函数作为参数
image.png

函数内定义函数,返回函数
image.png image.png

常见的高阶函数

  1. var nums = [10, 5, 11, 100, 55]
  2. // ================== 1.filter: 过滤 ==================
  3. var newNums = nums.filter(function(item) {
  4. return item % 2 === 0 // 偶数
  5. })
  6. console.log(newNums) // [10,100]
  7. // ================== 2.map: 映射 ==================
  8. var newNums2 = nums.map(function(item) {
  9. return item * 10
  10. })
  11. console.log(newNums2) // [100, 50, 110, 1000, 550]
  12. // ================== 3.forEach: 迭代 ==================
  13. nums.forEach(function(item) {
  14. console.log(item)
  15. // 10
  16. // 5
  17. // 11
  18. // 100
  19. // 55
  20. })
  21. // ================== 4.find/findIndex 查找 ==================
  22. // es6~12
  23. var friends = [
  24. {name: "why", age: 18},
  25. {name: "kobe", age: 40},
  26. {name: "james", age: 35},
  27. {name: "curry", age: 30},
  28. ]
  29. var findFriend = friends.find(function(item) {
  30. return item.name === 'james'
  31. })
  32. console.log(findFriend) // {name: "james", age: 35}
  33. var friendIndex = friends.findIndex(function(item) {
  34. return item.name === 'james'
  35. })
  36. console.log(friendIndex) // 2
  37. // ================== 5.reduce: 累加 ==================
  38. var total = nums.reduce(function(prevValue, item) {
  39. return prevValue + item
  40. }, 0)
  41. console.log(total) // 181

闭包定义

image.png
image.png
image.png
image.png
image.png

闭包的执行过程

image.png

image.png

闭包的内存泄露

image.png

解决内存泄露

image.png
image.png
设置为null后, 下次内存回收,就会回收,并不是立刻回收
image.png

属性的垃圾回收

闭包没有用到的属性,也会回收
image.png

========================

ES12 监听垃圾回收

image.png
image.png

这样过了一段时间垃圾回收系统回收时(不定时),就会调用函数

注册时还可以绑定一个参数,哪个对象回收时就会用这个参数
image.png