HelloChunWei / blog

個人部落格,紀錄自己的知識
MIT License
7 stars 0 forks source link

為什麼大家都說 async/await 是 ES7 的規範呢? #2

Open HelloChunWei opened 4 years ago

HelloChunWei commented 4 years ago

為什麼大家都說 async/await 是 ES7 的規範呢?

前言

在上一篇Javascript decorator 你搞得我好亂呀 中有提到根據 ECMAScript 的文件,async/await 是規範在 ECMA2017 (ES8) 而不是 ECMA2016 (ES7) 今天我就來試試看尋找為什麼大家都說是 ES7 的源頭吧。

萬事先 google

首先我先 google: ES7 async/await 再來 google: ES8 async/await

可以看到網路上有些人說是 ES7 ,也有些人說 ES8。(但如果只用 async/await google的話,我查到的都是說 ES7)

接下來試著去 TC39 的文件中找找蛛絲馬跡吧!

tc39 async/await 中我們可以找到 async/await 的規格書從日期上是在 2016 1月的時候,但 ECMA2016 (ES7) 發布時間是在 2016 6月的時候。所以有可能是因為時間上接近所以大家都誤以為他是 ECMA2016 (ES7) 的標準嗎?

而且根據 TC39 process 中提到的,stage 3 的規格書基本上可以當作是最終版的規格書,除非有重大的 bug 或者錯誤,不然不會更改。所以根據 stage 3 的規格書去應用 async/await 是沒問題的。

V8 以及 babel 是什麼時候加入 async/await 的特性呢?

竟然知道了規格書是在 2016/01 的時候出現,那就來看看 v8 以及 babel 是什麼時候加入特性的。或許因為他們加入的時間導致某部分的人以為 async/await 是 ECMA2016 (ES7) 的規範。

v8

進入到 v8 的 github 在 commit 中搜尋 async await 應該就可以 v8 知道是什麼時候加入async/await的。

所以 commit message 真的不能亂寫呀

在 2016 5月時候的 commit 可以看到 v8 加入了 async/await [esnext] implement frontend changes for async/await proposal

babel

同理,一樣到 babel 的 github 利用 commit 去搜尋。

驚人的是...... babel 早在2014的11月就把 async/await 實作了 Implement ES7 Async/Await 而且標題直接打上 Implement ES7 Async/Await,不過那時候連 ECMA2015 (ES6) 都還沒出來呀~ 所以你就是兇手!? (欸

結論

這一次的經驗對實際開發並沒有太大的幫助,況且,是不是因為 babel 的 commmit 讓人誤以為 async/await 是ECMA2016 (ES7) 的規範,這單純只是我的猜測,真相或許不是這樣。

總之,感謝這麼多人的努力,讓我可以用方便的語法糖開發,至於他是什麼年份的規範,就不用花太多心思計較了。

以後有人跟你說 async/await 是 ES7 的,你可以大聲的跟他說「不~他是 ES8 的」。

參考資料

  1. babel
  2. v8
  3. async function