JS 执行绪与同步 非同步 DAY50

这里额外补充2个观念

Not Defined VS undefined

Not Defined

console.log(a); //not defined
//因为尚未配置记忆体空间

undefined

var a;
console.log(a); //undefined
//已配置记忆体空间,但尚未赋予值

另外,在开发上
要避免 undefined 赋予到一个变数上
undefined 是系统自动编配,并非给我们直接使用
若要使用空值在一个变数上,请用 null

// 要避免 undefined 赋予到一个变数上
var a = undefined;
// 若要使用空值在一个变数上,请用 null
var b = null;

回收机制(Garbage collection)

这是有关於记忆体
函式的执行环境中,会创造自己的记忆体
当它离开的时候,也会把记忆体释放
https://ithelp.ithome.com.tw/upload/images/20201014/20123039Xm3h3qyKlg.png
MDN : https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Memory_Management


执行绪与同步、非同步
JS 属於一个 单执行绪(Single Thread) 的程序
单执行绪 主要是作业系统运行的概念
那它到底是什麽呢??

// 皮杰先生 有3个任务 吃饭 洗澡 看电视

// 单执行绪
// 皮杰先生同时间只能做一件事情

//多执行绪
// 皮杰先生同时间能做多件事情

这时候应该会有人说
那 JS不是有 非同步
那它又是什麽??

同步(Synchronous)与非同步(Asynchronous)

上述所提到的 单执行绪 是针对於系统的执行
非同步则是针对程序语言本身

同步
依序执行 不会因为还没吃完早餐就跳到洗碗盘
https://ithelp.ithome.com.tw/upload/images/20201014/20123039Zb7SmlIYYE.jpg

非同步
非同步的任务(setTimeout)会往後放
那为什麽它可以往後放呢???
请往下继续看罗~~
https://ithelp.ithome.com.tw/upload/images/20201014/201230397LqKbJ9RzE.jpg


JS还是依据同步来执行程序码
只是非同步的行为会先移动到事件伫列
https://ithelp.ithome.com.tw/upload/images/20201014/20123039lPXZWkxumH.jpg

所以这里的执行堆叠为

function eatBreakfast(){
    console.log('吃早餐');
}
function callSomeone(name){
    console.log('打给'+ name);
    setTimeout(function(){
        console.log(name + '回电');
    },1000)
    //这里就算设为 0 秒 ,一样会放到事件伫列
}
function washingPlate(){
    console.log('洗盘子');
}
function doWork(){
    var name = '小花'
    eatBreakfast();
    callSomeone(name);
    washingPlate();
}
doWork();

// doWork()
// eatBreakfast()
// callSomeone()
// callSomeone()里的setTimeout先放到事件伫列
// washingPlate()
// 程序码执行完
// 再执行非同步行为

这里再举一个例子

function clickMe (){
    console.log('成功');
}
var el = document.querySelector('p');
el.addEventListener('click',clickMe,false)
//这里会将 click行为 放到事件伫列
//若有点击 才会执行

经典例子

for(var i = 0 ; i < 3 ;i++){
    setTimeout(function(){
        console.log(i); // 3 执行3次 
    },0)
}
// 每次执行回圈 setTimeout被放到事件伫列 但不会先执行里面的函式
// 等到 i === 3 回圈不符合 才执行setTimeout
// 这时候 i 为 3 (执行三次 因被放到事件伫列 3次)

上述例子
等我们介绍到 JS ES6 let 将会再次出现
答案会有所不同/images/emoticon/emoticon07.gif

那今天的介绍就到这里
若有任何问题 或 内容有误
请跟我说唷/images/emoticon/emoticon08.gif


<<:  问责制,审计和审计追踪(Accountability, Auditing, and Audit Trail)

>>:  [Golang]select 语句的分支选择规则-心智图总结

【红黑树十讲・参】红黑树新增・四大规则介绍・完整图解步骤

Youtube连结:https://bit.ly/3inN3zI 红黑树的新增观念,涵盖「旋转」与...

D30. 学习基础C、C++语言

D30. 心得 虽然之前已经有学过一些C语言,但经过这30天的自学还是学到很多东西,像是C语言之前我...

第 13 天 长痛不如短痛!整理专案|feature module、shared module

前情提要 完成了新增英雄页面、英雄资讯元件後,在我们劝诱青铜五小强之前,让我们先停一停,来重构整个专...

【把玩Azure DevOps】Day30 2021铁人赛结尾感言

终於来到了铁人赛的最後一天,按照惯例在最後一天的文章是用来结尾的,所以并没有任何的技术含量,只是聊聊...

Day27条件选择器switch(JavaScript)

switch 主要功能是依据不同的条件去执行其动作 他基本型态会长这样 switch (expres...