深入理解JS | 青训营笔记

62 阅读3分钟

一、JS的基本概念

1.诞生:借鉴C语言基本语法,借鉴Java的数据类型和内存管理,函数是第一等公民的思想,基于原型的继承机制。

2.发展:Mocha->LiveScript->JavaScript->ECMAScript->Node.js->npm

3.进程: Browser进程、GPU进程、渲染进程、插件进程、网络进程。

渲染进程中包括GUI线程、JS线程、事件触发线程、定时器触发线程、网络线程。

4.特点: 单线程,动态、弱类型,面向对象、函数式,解释类语言、JIT,安全、性能差。

5.数据类型: 字符串、undefined、数字、null、symbol、bigint、布尔、对象(数组、函数等)

6.作用域:变量的可访问性和可见性。 有全局作用域、函数作用域和块级作用域。

7.变量提升: 只有var,const和let没有,function可以先调用后定义,被赋值给变量的函数不能提前调用。

二、JS如何执行

源代码-抽象语法树(AST)-字节码-机器码

执行上下文:JS引擎解析到可执行代码片段(通常是函数调用)的时候,会做一些执行前的准备工作,这个工作就是执行上下文。

全局执行上下文:每个生命周期内只有一个,代码开始执行时就会创建,将他压到执行栈的栈底。

函数执行上下文:执行一个函数的时候,函数内的代码会被编译,生成变量环境、词法环境等。函数执行结束时,对应的执行环境从栈顶弹出。

创建执行上下文的时候,创建变量环境、创建词法环境、绑定this。

  • 词法环境:基于ECMAScript代码的词法嵌套结构来定义标识符和具体变量和函数的关联,一个词法环境由环境记录器和一个可能的引用外部词法环境的空值组成。存储var变量绑定。
  • 变量环境:用来存储函数声明和变量(let和const)绑定。
  • Outer:指向外部变量环境的一个指针。

三、进阶知识

1.闭包:在一个函数内部定义的函数可以访问外部函数的变量和参数。

  • 如果引用闭包的函数是一个全局变量,那么闭包会一直存在直到页面关闭,如果这个闭包不再使用会造成内存泄露。
  • 如果引用闭包的函数是一个局部变量,一旦函数被销毁,JS引擎的垃圾回收机制就会回收这块内存。

2.this

  • 普通函数的this指向windows
  • 对象调用方法中的this指向该对象
  • 先赋值再调用,看调用的地方。
  • 构造函数中的this指向构造函数创建的实例。

3.垃圾回收

一个V8进程的内存包括新生代内存区和老生代内存区,JS引擎针对新生代和老生代采用两种不同的垃圾回收机制。新生代存放生存周期短的对象,老生代存放生存周期长的对象。

  • 新生代空间对半分成对象区域和空闲区域,新建的对象首先被分配到对象区域,对象区域快写满时,就执行垃圾清理操作。先对象复制再区域反转。

  • 老生代空间先标记要回收的变量,再进行清除,然后将内存空间整理到一边。

四、思考

学习了js基础知识,其中作用域、闭包和垃圾回收机制相互联系,是要掌握的重点,可以放在一起理解。