微任务和宏任务

setTimeout(_ => console.log(4))//delay的默认值为0

new Promise(resolve => {
  resolve()
  console.log(1)
}).then(_ => {
  console.log(3)
})

console.log(2)

这段代码的顺序是1、2、3、4,原因是js同步执行完任务前不会执行异步任务(这是很容易理解大家也应该知道的)。然后Promise对象实例化是一个同步的过程,只有then后面的才是异步。所以1,2是同步任务,3,4是异步任务,现在的顺序就很合理了。

不过,3明明在4后面,怎么还先输出呢?这是因为微任务会在宏任务之前执行,Promise.then就是典型的微任务,注意是.then,不是Promise本身。

为了避免混淆,有必要指明一下,宏任务、微任务与同步、异步并不直接对应。

目前比较公认的说法是,I/O和setTimeout和setInterval是宏任务,而微任务包括但不限于Promise.then和catch和finally。

Event-loop

那么Event-loop是什么意思?这个概念只和微任务宏任务有关,即每次做完一个任务都会检查:现在还有没有微任务呢~没有的话就开始做宏任务了哦~等下一波检查才有机会执行微任务咯

async和await

新的异步机制,await之前同步,await之后异步,await可以理解为then。至于异步呢,常用于等待获取文件或资源。

观察者模式和发布-订阅模式

观察者模式

一般的实现是一个对象维护一个列表,发生事件时通知列表中的对象。

发布-订阅模式

和观察者模式类似,但发生事件时发布者通知订阅者,由订阅者通知对象。发布订阅模式更容易解藕、异步、缓存、过滤。

JS中的实现

JS提供setter和getter实现此机制(实现watch)。

Object.defineProperty提供了更多属性的配置。

var language = {
  set current(name) {
    this.log.push(name);
  },
  log: []
}

language.current = 'EN';
language.current = 'FA';

console.log(language.log);
// expected output: Array ["EN", "FA"]

HTTP/2

HTTP请求资源时一个一次连接,HTTP/2改为持续性连接。

服务器可以主动发起推送。

通过设置优先级避免关键请求导致阻塞。

明文传输变为二进制帧传输,不过我也不知道1.0和1.1是不是用的ASCII码和MIME。

事件流

分为冒泡和捕获。冒泡向上,捕获向下。

Viewport

往期文章

Arguments

函数接受的任意长的参数数组,但不是普通数组。它的存在也意味着js函数可以接受任意多个参数,且没有重载的说法。可以用Array.from()转换为数组。

Bind

引用方法时会失去与对象的连接,bind的作用是绑定对象。

盒子模型

太基础了

箭头函数

不能用new,this值为上下文且固定,没有arguments

requestAnimationFrame

每次绘制一帧前都向回掉函数发送时间戳,并执行回掉函数。

apply和call

改变this,一个是参数数组,一个传很多参数,实质都一样

DI和AOP

AOP,Aspect Oriented Programming 面向切面的程序设计

AOP即不修改源代码增加功能,通过预编译和动态代理实现

DI 依赖注入,实现IoC控制反转 和结构层次化、接口有关 就是定义下层接口,通常用于插件

“防抖”(Debouncing)和“节流”(Throttling)

防抖和节流,即限制事件在一定时间内的发生次数,或者说把多次事件合并为一次,这个可能经常用过但不知道叫防抖,通常用在响应特别频繁的事件上。

他们的区别在于,防抖一般等所有事件完了再响应,节流是以一定频率响应。

这个可以和requestAnimationFrame放到一起考虑。