前端JS三大基础——原型链、闭包、异步、js循环机制、垃圾回收机制

189 阅读4分钟

变量类型和计算

  • 值类型vs引用类型、堆栈模型、深拷贝
  • typeof运算符
  • 类型转换、truly和falsely变量

原型与原型链

class和继承

class

  • constructor
  • 属性
  • 方法

继承

  • extends
  • super
  • 扩展或者重写方法

类型的判断instanceof,通常用于判断数组

原型与原型链

每个class都有显示原型 prototype

每个实例都有隐式原型 proto

每个实例的隐式原型指向class的显式原型

原型链的执行规则

先找自身的_proto_如果没有 则一直找 直到找到为止

InstanceOf 这个方法 就是判断这个实例有没有在圆形链里面

闭包与作用域

作用域

  • 全局作用域
  • 函数作用域
  • 块级作用域(ES6新增 语法let、const)
自由变量
  • 一个变量在当前作用域没有定义、但是被使用了
  • 向上级作用域、一层一层依次寻找、直到找到为止
  • 如果到全局作用域都没找到、则报错 xx is not defined
  • 总结闭包里的自由变量查找,是在函数定义的地方,向上级作用域查找不是在执行的地方。
this
  • 作为普通函数 -> window
  • 使用call、apply、bind(返回新的函数)(都可以改变this指向) -> 传入的对象
  • 作为对象方法被调用 -> 调用的对象
  • 在class方法中被调用 -> 实例对象
  • 箭头函数 -> 永远取上级作用域this
  • 总结this的取值是在执行时确定的,不是定义时候确定的。

闭包 函数作为返回值、参数。内存不会被释放。自由变量 使用完会被释放。

异步与单线程(js的循环机制)

  • js是个单线程语言、js和dom渲染是共用一个进程
  • 异步的出现是为了解决js单线程问题
  • 异步代码不会阻塞、同步会阻塞代码执行
  • 异步的运用场景(网络请求如ajax图片加载、定时任务)

promise解决回调地狱

首先定义个一个 function,里面 new promise 里面写一个ajax(url,success里面resolve、error里面reject)。最后请求调用function的方法,成功就点then有多少个循环调用就使用多少个点then。

JS的循环机制

eventLoop描述:js是个单线程运行的、异步要基于回调来实现、eventloop就是异步回调的实现原理

  • 进入到script就是进入到了第一次事件循环
  • 遇到同步代码立即执行
  • 遇到宏任务把它放入宏任务队列中
  • 遇到微任务把它放入微任务队列中
  • 执行完所有同步代码
  • 执行微任务代码,本次队列清空
  • 寻找下一个宏任务,重复上面的执行顺序。
  • 以此反复直到清空所有宏任务,这种不断重复的机制被称为事件循环。

在js的引擎里面

  • call stack调用栈
  • web api在ES6规范之外,浏览器定义的
  • event loop事件循环
  • callback queue回调函数队列
  • 同步代码一行一行的放在Call Stack执行、遇见异步会先记录一下等待时机(定时、网络请求等)、时机到了就移动到callback queue、如果call stack为空(既同步代码执行完毕)Eventloop开始工作、轮询查找callback queue、如果有则移动到call stack、然后继续轮询查找(不断的重复直到任务执行完毕)

event loop和DOM渲染

JS是单线程的,而且和DOM渲染共用一个线程

JS执行的时候,得留一些时机供DOM渲染

当Call Stack空闲的时候,先尝试DOM渲染,再去触发Event Loop机制

宏任务与微任务

  • 宏任务: setTimeout, setInterval,Ajax, DOM事件
  • 微任务: Promise Async await
  • 微任务执行时机比宏任务要早

Promise的基本原理

  • Promise是一个类
  • Promise类在执行时会传入一个执行器函数,该函数会立即执行
  • Promise具有三种状态 Pending Fulfilled Rejected
  • Promise状态一旦确定就不可以改变,且状态只能由
  • Pending => Fulfilled(成功) Pending => Rejected(失败)
  • 状态的改变由resolve,reject两个方法改变 then方法内部做的事情是状态判断
  • 如果是Fulfilled状态则执行成功的回调 如果是Rejected状态则执行失败的回调
  • Promise的链式调用需要在then方法中返回一个Promise实例

async/await

  • 执行async函数,返回的是一个promise对象
  • await 相当于promise的then 所以await后就是promise
  • try...catch可捕获异常代替了promise的catch
  • 是消灭异步回调的一个方法、语法糖。