深入理解JS|青训营笔记

77 阅读2分钟

JS的特点

  • 单线程
  • 动态、弱类型
    • 动态语言(弱类型):运行时才确定数据类型,变量在使用之前无需申明类型
    • 静态类型(强类型):编译时需要确定变量的数据类型
  • 面向对象 函数式
    • 纯函数:相同的输入,总是会的到相同的输出,并且在执行过程中没有任何副作用
    • 原型、继承、封装
  • 解释类语言(实际上JS并不是纯的解释执行语言,也是会经过编译的) JIT(即时编译)
  • 安全、性能差

JS的数据类型

复杂数据类型: Object、Array、Date等,真正的对象实例存放在堆空间

基础数据类型:数据直接存放在变量(栈空间)中

作用域

变量的可访问性和可见性;JS为静态作用域

  • 全局作用域
  • 函数作用域
  • 块级作用域

变量提升

  • var有变量提升
  • let 和 const 没有变量提升
  • function函数可以先调用再定义
  • 赋值给变量的函数无法提前调用

JS如何执行

fig1.png

  • 源代码通过语法分析和词法分析生成抽象语法树AST与执行上下文
  • AST转化为字节码,然后逐行解释执行为机器码
  • 热代码(相同的代码出现两次及以上)优化

执行上下文:当JS引擎解析到可执行代码片段的时候所做的准备工作,也叫执行环境,包括:

  • 变量环境:用来存储函数声明和变量(let 和 const)绑定
  • 词法环境:存储var变量绑定
  • this
  • 可执行代码
  • outer:指向外层变量环境的指针

全局执行上下文:代码开始执行时创建,位于执行栈底,每个生命周期内只有一份

函数执行上下文:当执行函数时创建,执行结束后从栈顶弹出

闭包

闭包就是指有权访问另一个函数作用域中的变量的函数,在一个函数内部创建另一个函数时则产生闭包

缺点:内存不容易被回收,容易导致内存泄漏

this的指向

  • 普通函数的this指向window
  • 对象调用时this指向对象;先赋值再调用看调用的地方

垃圾回收

  • 新生代空间(1M-8M):对象区域 空闲区域
  • 老生代:较大内存的变量或新生代空间中经历两轮垃圾回收仍未回收的变量

总结

本节课主要对JS的基础概念做了总结,不过语法部分并没有介绍,学的太久有很多都没啥印象了,后面需要抽时间复习一下