Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
JavaScript を書き始める前に知っておきたい JavaScript のこと #03
Search
Kotaro Chiba
June 27, 2020
Technology
1
370
JavaScript を書き始める前に知っておきたい JavaScript のこと #03
JavaScript の実行を制御している `イベントループ` の仕組みに迫ってみます
Kotaro Chiba
June 27, 2020
Tweet
Share
More Decks by Kotaro Chiba
See All by Kotaro Chiba
JavaScript を書き始める前に知っておきたい JavaScript のこと #05
uruha
1
450
JavaScript を書き始める前に知っておきたい JavaScript のこと #04
uruha
1
480
DMM.com のフロントエンド 今・今後 / Think ! FrontEnd #01
uruha
1
1.4k
JavaScript を書き始める前に知っておきたい JavaScript のこと #02
uruha
1
1.3k
JavaScript を書き始める前に知っておきたい JavaScript のこと
uruha
1
620
JavaScript を書き始める前にやっておきたいこと / Kanazawa.js meetup #1
uruha
1
1.1k
JConf JP Sponsor talk DMM.com / TECH VISION に向けての取り組み
uruha
1
440
Other Decks in Technology
See All in Technology
【Pycon mini 東海 2024】Google Colaboratoryで試すVLM
kazuhitotakahashi
2
500
DMARC 対応の話 - MIXI CTO オフィスアワー #04
bbqallstars
1
160
ISUCONに強くなるかもしれない日々の過ごしかた/Findy ISUCON 2024-11-14
fujiwara3
8
870
ドメイン名の終活について - JPAAWG 7th -
mikit
33
20k
B2B SaaSから見た最近のC#/.NETの進化
sansantech
PRO
0
750
ハイパーパラメータチューニングって何をしているの
toridori_dev
0
140
Python(PYNQ)がテーマのAMD主催のFPGAコンテストに参加してきた
iotengineer22
0
470
20241120_JAWS_東京_ランチタイムLT#17_AWS認定全冠の先へ
tsumita
2
250
Lexical Analysis
shigashiyama
1
150
BLADE: An Attempt to Automate Penetration Testing Using Autonomous AI Agents
bbrbbq
0
300
Why App Signing Matters for Your Android Apps - Android Bangkok Conference 2024
akexorcist
0
120
Adopting Jetpack Compose in Your Existing Project - GDG DevFest Bangkok 2024
akexorcist
0
110
Featured
See All Featured
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
38
1.8k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
Code Reviewing Like a Champion
maltzj
520
39k
Six Lessons from altMBA
skipperchong
27
3.5k
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
What's new in Ruby 2.0
geeforr
343
31k
Building a Modern Day E-commerce SEO Strategy
aleyda
38
6.9k
Java REST API Framework Comparison - PWX 2021
mraible
PRO
28
8.2k
Into the Great Unknown - MozCon
thekraken
32
1.5k
Transcript
JavaScript を書き始める前に知 っておきたい JavaScript のこと #03 Kanazawa.js Remote Meetup #04
千葉 弘太郎 1 1
千葉 弘太郎(ちば こうたろう) Kotaro Chiba Twitter: @ur_uha Github: uruha Work:
DMM.com LLC 2 2
前回 JavaScript を書き始める前に知っておきたい JavaScript のこと #02 「ざっくり知る」JavaScript の prototype について
3 3
今回 JavaScript の実⾏順に迫る イベントループ の仕組み 4 4
JavaScript が実⾏される環境 シングルスレッド で⼀度に実⾏できるタスクは1つのみ 5 5
´・ω・` 。o0(じゃあどうやってあんなにたくさんの⾮同期 の処理を実⾏できてるの???) 6 6
´・ω・` 。o0(処理に30秒かかる実⾏があったら30秒間⽌ まっちゃうんですか...???ツライ...) 7 7
実際は... . イベントループ . Web API を駆使して⾮同期的な処理をしているように⾒せている。 8 8
JavaScript は以下のような関係性で処理を⾏っています。 Call Stack ───────→ Web API │ │ │
│ │ │ Event Loop ←──────→ ⏯ Queue 9 9
/** 1 */ function start() { return 'start :)'; }
/** 2 */ function asyncFunc() { return setIimeout(() => 'exec !', 1000); } /** 3 */ function end() { return 'end ;)'; } start(); // start :) asyncFunc(); // exec ! end(); // end ;) 10 10
なんとなく 1. start :) -> 3. end ;) -> 2.
exec ! の順で結果が出⼒されるのは予想できる。 11 11
なんでかな? 12 12
/** 1 */ function start() { return 'start :)'; }
Call Stack ───────→ Web API [start()] │ │ │ │ │ │ Event Loop ←──────→ ⏯ Queue start() は call stack で呼び出されて、 start :) が出⼒されて終わる(ポップされる) 13 13
/** 2 */ function asyncFunc() { return setIimeout(() => 'exec
!', 1000); } Call Stack ───────→ Web API [asyncFunc()] [() => 'exec !', 1000sec] [setTimeout()] │ │ │ │ │ │ │ Event Loop ←──────→ ⏯ Queue asyncFunc() が実⾏されて setTimeout が callback を WebAPI に追加します。 asyncFunc, setTimeout はこれでポップ。 14 14
Call Stack ───────→ Web API [end()] [after 1000sec] │ │
│ │ │ │ Event Loop ←──────→ ⏯ Queue [() => 'exec !'] 1秒後に callback 内の () => 'exec !' が queue へ。 call stack 側にはまだ end() がいるので、先に end() が 実⾏されます。 15 15
Call Stack ───────→ Web API [() => 'exec !'] │
│ │ │ │ │ Event Loop ←──────→ ⏯ Queue Event loop が call stack に何も無いことを確認して、 queue の callback関数を実⾏します。 16 16
まとめ . 関数の実⾏は call stack で . 関数の処理によっては Web API
を介して callback など queue に待機させる . Event loop は call stack と queue を監視している . Call stack に実⾏する関数が無くなった時 event loop が queue に溜まっている関数を call stack へ移して実⾏ 17 17
ちょっと詳しく Queue にはいくつか種類がある Macrotask setTimeout | setInterval | setImmediate Microtask
process.nextTick | Promise callback ...etc Event loop が実⾏する queue の順序は Microtask > Macrotask の順 18 18
次回 どうしようかな... ´・ω・` OOPとかをプロトタイプで説明してもちょっと過去の産物 になりそうなので、違うネタにする予定 なにか要望ありますか? 19 19