[F]译文:JS单线程、JS任务队列

写在前面:

文章脉路:

  • 案例
  • 初步猜测结果
  • 测试验证,发现和预想不一致,为什么?
  • 引出原理讲解
  • 把原理套在案例里
  • 更多案例印证原理

关键词:
单线程single-threaded
异步 async (asynchronous)
回调 callback
执行栈/调用栈 a call stack
任务队列 callback; queue
事件循环 event loop


不完全译文:

原文地址:If Javascript Is Single Threaded, How Is It Asynchronous?

原文作者: @Brian Barbour

Javascript是一门单线程的编程语言。这意味着它将使用一个执行栈以及一个内存堆。正如单线程给我们的印象那样,它按顺序执行代码,并且必须先完成执行片段代码(a piece code),然后才能继续执行下一个代码。它是同步的,但有时可能是有害的。例如,如果某个函数需要一段时间才能执行或必须等待某件事,那么它会同时冻结所有内容。

窗口警报功能就是一个很好的例子。 alert("Hello World")

直到您单击确定并关闭警报,您才能与该网页进行交互。you are stuck。

So how do we get asynchronous code with Javascript then?

Well, 我们要为此感谢Javascript引擎(V8,Spidermonkey,JavaScriptCore等),这些引擎具有可在background处理这些任务的Web API。执行栈认得出Web API的(functions),并且交给浏览器去处理。浏览器完成这些任务后,它们将返回并作为callback被压入stack

The call stack recognizes functions of the Web API and hands them off to be handled by the browser. Once those tasks are finished by the browser, they return and are pushed onto the stack as a callback.

打开控制台并键入window然后按Enter。您将看到Web API必须提供的大多数内容。其中包括ajax调用,事件监听器,提取API和setTimeout之类的内容。Javascript使用低级编程语言(例如C ++)在后台执行这些操作。

Open your console and type window then press enter. You'll see most everything the Web API has to offer. This includes things like ajax calls, event listeners, the fetch API, and setTimeout. Javascript uses low level programming languages like C++ to perform these behind the scenes.

-案例

Let's look at a simple example, run this code your console:

console.log("first")
setTimeout(() => {
    console.log("second")
}, 1000)
console.log("third")

-初步猜测结果(非译文内容)

控制台依次输出first-second-third

-测试验证

What did we get back?

first
third
undefined
second

-原理讲解(flag)

Feels odd, right? Well, let's break this down line by line:
console.log("first")is on the stack first, so it gets printed. Next, the engine notices setTimeout, which isn't handled by Javascript and pushes it off to the WebAPI to be done asynchronously. The call stack moves on without caring about the code handed off to the Web APIs and console.log("three")is printed.
Next, the Javascript engine's event loop kicks in, like a little kid asking "Are we there yet?" on a road trip. It starts firing, waiting for events to be pushed into it. Since the setTimeout isn't finished, it returns undefined, as the default, well because it hasn't been given the value yet. Once the callback finally does hits we get console.log("second")printed.

-沙盒推荐 (flag)

There's a really good site that slows this all down and shows this happening.

http://latentflip.com/loupe

I suggest playing around in this sandbox to help solidify your understanding. It helped me get a feel for how asynchronous code can work with Javascript being single threaded.


小记过去笔者@buuoltwo的最简理解:

  1. 单线程是JavaScript语言的一大特点,简单的说就是一个人同一时间只能做一件事情。
  2. 主线程处理同步任务
  3. 任务队列处理异步任务
  4. -任务队列是JS把异步任务挂起,做了个异步任务清单
    JS在跑完执行栈的同步任务后才把任务队列的异步任务推送给主线程
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355