Skip to content

Commit 392750c

Browse files
committed
chore(ci): blog sync
1 parent df8caf9 commit 392750c

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

data/blog/liulanqidixuanranyuanli.mdx

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
title: 浏览器的渲染原理
3+
date: 2023-12-23T12:42:45Z
4+
summary:
5+
tags: ["浏览器"]
6+
---
7+
8+
![浏览器的渲染原理](http://82.157.237.225:4000/images/浏览器的渲染原理.jpg)
9+
## 浏览器的渲染原理
10+
当我在浏览器地址栏输入www.baidu.com时,浏览器会如何运作呢?经过DNS服务器的解析网站域名被转化成ip地址,浏览器将该ip地址上的资源下载下来,通过HTML-Parser将HTML解析为DOM树。通过CSS-Parser将css解析为Style树,将两个合并成为Render树。Render树会结合当前浏览器layout的状态将Render树渲染到页面上,这是浏览器内核完成的操作。
11+
12+
![v8解析图](http://82.157.237.225:4000/images/v8解析图.jpg )
13+
14+
以chrome浏览器为例,javascript代码会被浏览器的v8引擎解析,成一个抽象树,抽象树会被优化转变为机器码,机器码根据不同的系统环境转化为相应的字节码,然后被cpu解析。
15+
## 代码的执行过程
16+
在javascript被v8引擎解析后,会有一个预编译的过程,会创建全局执行上下文(global exection context)并在函数的调用栈中执行,全局声明的函数和变量会被放入GO(global Object)中,此时他们的值为undefined,这就是为什么当我们在声明变量之前直接打印对象,结果是undefined,在执行到赋值代码时,他们才有了值,我们常常把这个叫做变量提升。GO对象指向的就是window对象。
17+
而全局声明的函数在全局执行上下文中也被放入GO对象,他们的值是一个内存地址,这个地址保存着该函数的函数体和父级作用域,当这个函数会被调用时,会在函数的调用栈中创建一个函数的执行上下文,并会创建出一个AO(activation)对象,保存函数中的变量和函数接收的参数,声明的变量会放入AO对象,他们的值为undefined,在执行到赋值代码时他们才会被赋上值,待函数执行完毕后,函数的执行上下文会被弹出调用栈,AO对象就会被销毁
18+
## 作用域和作用域链
19+
全局作用域,即最外层的作用域,在代码里声明的函数有自己的局部作用域,在预编译时,对应作用域声明的对象会被放入相应的AO/GO对象中,并赋上undefined,作用域链指的是函数使用变量时会在自己的作用域查找,如果没有找到,就会在他的父级作用域中查找。
20+
## js的内存管理
21+
javascript的内存分为栈解构和堆结构,基本数据类型内存分配在栈解构中,复杂数据类型分配在堆结构中。
22+
javascript有自己的垃圾回收机制,广泛采用的算法是标记清除算法(从根一直往下找,对没有引用的对象,就会进行清除)
23+

data/blog/shiyaoshibibao?.mdx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
---
2+
title: 什么是闭包?
3+
date: 2023-12-23T12:43:44Z
4+
summary:
5+
tags: []
6+
---
7+
8+
## 闭包的定义
9+
闭包指的是一个函数对其周围状态的引用捆绑在一起,这样的组合称为闭包。
10+
通俗的来讲:
11+
```
12+
function foo(){
13+
var name = "你的名字是?"
14+
return function bar(){
15+
console.log(name);
16+
}
17+
}
18+
19+
let fn = foo()
20+
21+
fn()
22+
```
23+
一个函数,访问着外层的自由变量变量,这样就形成了一个闭包
24+
根据js内存回收机制(如上一个博客),没有被根指向的都会被销毁
25+
26+
## 内存泄漏
27+
foo的AO对象被bar的对象的parentScope指向,所以bar函数对象永远都不会被销毁,这种情况被称为内存泄漏
28+
如何消除内存泄漏呢?只需要fn = null 把fn指向另一个地方即可
29+

0 commit comments

Comments
 (0)