Javascript 进阶 2-9 执行绪与同步、非同步

        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 的执行绪 以及 非同步 的概念。

http://img2.58codes.com/2024/20121770OIS3IJ7pHz.png

Javascript 是单执行绪的程式

单执行绪是一种作业系统的运行概念,那什么是单执行绪呢?

http://img2.58codes.com/2024/20121770e1QJ0PKAU7.png

如图所示,小明一次只能做一件事,等到做完以后才能按照顺序做下一件事。

吃早餐 > 打电话给漂亮阿姨 > 洗碗

相对的,多执行绪的概念就是可以同时执行上述的三件事情

http://img2.58codes.com/2024/201217701tw7P9hCLj.png

但可以看到再打电话给漂亮阿姨这段有 setTimeout 的非同步事件,那么非同步又是甚么呢?

http://img2.58codes.com/2024/20121770yFXm5hzoY0.png

-- 单执行绪 => 系统地执行

-- 非同步 => 针对程式语言的本身

http://img2.58codes.com/2024/20121770zYL1R4VWCJ.png

非同步的任务会先移动到**事件伫列(Event Queue)**中,等到所有的同步事件执行完之后,才会执行非同步。

这里我们使用执行堆叠的概念来看一下这段程式码的运作方式

http://img2.58codes.com/2024/20121770dWZSRPgs9j.png

处理顺序如下:

全域 => 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' 的字串。

以上就是今天的内容,希望对大家有帮助,汪汪。


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章