function eatBreakfast () { console.log('吃早餐'); } function washingPlate () { console.log('洗餐盘'); } function callSomeone (someone) { console.log('打给' + someone); setTimeout(function () { console.log(someone + '回电'); }, 3000); } function doWork () { var auntie = '漂亮阿姨'; eatBreakfast(); callSomeone(auntie); washingPlate(); } doWork();
今天我们来讨论, ** 执行绪与同步、非同步**。
看到上方的程式码,eatBreakfast() 跟 washingPlate(); 都只是很简单的印出文字,另外
callSomeone 会传入人名,先印出打给 someone ,再进行非同步的 setTimeout 。
最后再 doWork 里面宣告 auntie 的变数,并且带入 callSomeone 中。
而这样的堆叠流程会是怎么样呢? 透过这个範例了解到 Javascript 的执行绪 以及 非同步 的概念。
Javascript 是单执行绪的程式
单执行绪是一种作业系统的运行概念,那什么是单执行绪呢?
如图所示,小明一次只能做一件事,等到做完以后才能按照顺序做下一件事。
吃早餐 > 打电话给漂亮阿姨 > 洗碗
相对的,多执行绪的概念就是可以同时执行上述的三件事情
但可以看到再打电话给漂亮阿姨这段有 setTimeout 的非同步事件,那么非同步又是甚么呢?
-- 单执行绪 => 系统地执行
-- 非同步 => 针对程式语言的本身
非同步的任务会先移动到**事件伫列(Event Queue)**中,等到所有的同步事件执行完之后,才会执行非同步。
这里我们使用执行堆叠的概念来看一下这段程式码的运作方式
处理顺序如下:
全域 => doWork => eatBreakfast => doWork => callSomeone => 遇到非同步,放到 Event Queue => doWork => washingPlate => doWork => 全域 => Event Queue 的非同步事件
以上就是非同步的概念,另外,事件的注册也是属于非同步喔!
<body> <p>点我</p> <script> function clickThis () { console.log('click'); } var dom = document.querySelector('p'); dom.addEventListener('click', clickThis, false); </script> </body>
当执行完以后会把注册的点击事件放到事件伫列中,当特定的元素被点击的时候,就会触发 function 印出 'click' 的字串。
以上就是今天的内容,希望对大家有帮助,汪汪。