fengdexunmi / We-Love-JavaScript

你不知道的JavaScript

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

你不知道的JavaScript(中卷)

第一章

异步

  • 直到ES6,JavaScript才真正内建有直接的异步概念

  • 事件循环机制

    • 处理程序中多个块的执行

    • JavaScript引擎本身并没有时间的概念,只是一个按需执行JavaScript任意代码片段的环境。“事件”调度总是由包含它的环境进行。

    • 什么是事件循环

      • 伪代码
         var eventLoop = [];
         var event;
         
         // 永远执行的循环
         while (true) {
          	// 一次tick
         	if (eventLoop.length > 0) {
         		//  拿到队列中的下一个事件
         		event = eventLoop.shift();
         		
         		// 现在执行下一个事件
         		try {
         			event();
         		} catch (err) {
         			reportError(err);
         		}	
         	}
         }
      • setTimeout(..)并没有把你的回调函数挂在事件循环队列中。它所做的是设定一个定时器。当定时器到时后,环境会把你的回调函数放在事件循环中,这样在未来某个时刻的tick会摘下并执行这个回调
    • ES6从本质上改变了在哪里管理事件循环

      • 在技术上将事件循环管理纳入JavaScript引擎的范围,而不是只由宿主环境来管理
      • 引入Promise,对事件循环队列的调度运行直接进行精细控制
  • 并行线程

    • “异步”和“并行”

      • 异步是关于现在和将来的时间间隙
      • 并行是关于能够同时发生的事情
    • 并行常见的工具是进程和线程。多个线程能够共享单个进程的内存

    • 事件循环把自身的工作分成一个个任务并顺序执行,不允许对共享内存的并行访问和修改。通过分立线程中彼此合作的事件循环,并行和顺序执行可以共存。

  • 并发

    • 是指两个或者多个事件链随时间发展交替进行,以至于在更高层次来看,就像在同时运行
  • 任务

    • 在ES6中,有一个新的概念建立在事件循环队列之上,叫任务队列(job queue)

      • 它是挂在事件循环队列的每个tick之后的一个队列。在事件循环的每个tick中,可能出现的异步工作不会导致一个完整的新事件添加到事件循环中,而会在当前的tick的任务队列末尾添加一个任务

第二章

回调

  • 回调函数包裹或者封装了程序的延续(continuation)

XMind: ZEN - Trial Version

About

你不知道的JavaScript