这里额外补充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;// 若要使用空值在一个变数上,请用 nullvar b = null;
回收机制(Garbage collection)
这是有关于记忆体
在函式的执行环境中,会创造自己的记忆体
当它离开的时候,也会把记忆体释放
MDN : https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Memory_Management
执行绪与同步、非同步
JS 属于一个 单执行绪(Single Thread) 的程式
单执行绪 主要是作业系统运行的概念
那它到底是什么呢??
例
// 皮杰先生 有3个任务 吃饭 洗澡 看电视// 单执行绪// 皮杰先生同时间只能做一件事情//多执行绪// 皮杰先生同时间能做多件事情
这时候应该会有人说
那 JS不是有 非同步吗
那它又是什么??
同步(Synchronous)与非同步(Asynchronous)
上述所提到的 单执行绪 是针对于系统的执行
非同步则是针对程式语言本身
同步
依序执行 不会因为还没吃完早餐就跳到洗碗盘
非同步
非同步的任务(setTimeout)会往后放
那为什么它可以往后放呢???
请往下继续看啰~~
JS还是依据同步来执行程式码
只是非同步的行为会先移动到事件伫列
所以这里的执行堆叠为
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 将会再次出现
答案会有所不同
那今天的介绍就到这里
若有任何问题 或 内容有误
请跟我说唷