--- tags: JS 直播班 - 2022 秋季班 --- # 第三週小組任務 - JS班 14 組 > 討論日期及時間 > 2022/10/15 20:00-21:30 > **組員參與名單(08/09):** * christina#6185 * hungya#0773 * DoraHuang#8223 * Winnie Wu#5468 * Potatolee#7749 * Nathan James#8120 * Sonia Wu#7154 <!-- * Tuhacrt#0008 --> * CrystalD#6007 ## 問題 ### 第一題 請挑選想討論的主題 請各組員在以下,挑選您不知道但想瞭解的 JS 主題或語法,並寫 2~3 個範例程式碼,以方便瞭解您有掌握該知識,並分享給其他組員: 1. [JS w3school](https://www.w3school.com.cn/) 2. [JavaScript 菜鳥教學](https://www.runoob.com/js/js-tutorial.html) 3. [Kuro 重新認識 JavaScript](https://ithelp.ithome.com.tw/users/20065504/ironman/1259) 4. [邁向 JavaScript 勇者之路](https://ithelp.ithome.com.tw/users/20083608/ironman/1354) 答: 1. ### 同步(Sync)與非同步(Async) * 同步(Sync): 一次只做一件事情,例如:堆疊(Call Stack)、JavaScript * 非同步(Async):同時做很多件事情,例如:向 API 發送請求、setTimeout、document、Node.js #### 同步 Sync 範例: Call Stack ``` function fun1() { console.log('fun1') } function fun2() { console.log('fun2') } function fun3() { console.log('fun3') } // 一次只做一件事情 fun1(); fun2(); fun3(); ``` #### 非同步 Async 範例: setTimeout ``` setTimeout(() => { console.log("延遲3秒出現"); }, 3000) ``` #### 非同步 Async 範例: Primise、Async/ Await ``` // 製作漢堡 const makeHamburger = function() { return new Promise(function(resolve, reject){ window.setTimeout(function(){ console.log('已準備好「超級大麥海洋珍珠堡」'); resolve('已準備好「超級大麥海洋珍珠堡」'); }, (Math.random() + 1)*1000); //Math.random() + 1 : 隨機產生亂數 }); } // 製作沙拉 const makeSalad = function() { return new Promise(function(resolve, reject){ window.setTimeout(function(){ console.log('已準備好「夏威夷鮮蔬沙拉」'); resolve('已準備好「夏威夷鮮蔬沙拉」'); }, (Math.random() + 1)*1000); //Math.random() + 1 : 隨機產生亂數 }); } // 製作飲料 const makeDrink = function() { return new Promise(function(resolve, reject){ window.setTimeout(function(){ console.log('已準備好「台東紅烏龍茶」'); resolve('已準備好「台東紅烏龍茶」'); }, (Math.random() + 1)*1000); //Math.random() + 1 : 隨機產生亂數 }); } // 餐點準備完成,提供給客人 const giveCustomer = function() { console.log('所有餐點準備完成,提供給客人'); } //依照順序執行函式 /* async function completed(){ // 餐點依順序完成 let done; done = await makeHamburger(); done = await makeSalad(); done = await makeDrink(); done = await giveCustomer(); } */ //依照順序執行函式 async function completed(){ // 餐點不依順序完成 // Promise.all() : 全部任務完成,才會往下執行 let done = await Promise.all([makeHamburger(),makeSalad(),makeDrink()]); done = await giveCustomer(); } completed(); ``` > [重新認識 JavaScript: Day 18 Callback Function 與 IIFE](https://ithelp.ithome.com.tw/articles/10192739) > (剛好都想了解這個 XD) #### 立即被呼叫的函式 (Immediately Invoked Function Expression, IIFE) * window.setTimeout 帶有兩個參數,第一個是要做的事情,用一個函式來代表,第二個則是時間 (1/1000 秒, milliseconds)。 而第一個參數的函式也是 Callback function 的一種:「在經過了某段時間之後,才執行的函式」。 * 切分變數有效範圍的最小單位是 "function"~ for 迴圈並不會等待 window.setTimeout 結束後才繼續,所以當 window.setTimeout 內的 Callback Function 執行時,拿到的 i 已經是跑完 for() 迴圈的 5。 | Name | link | | -------- | -------- | | hungya#0773 | [Link](https://eggplant-form-7a1.notion.site/Javascript-Primise-Async-Await-064698b8d16a472f9755c0297de013b7) | | DoraHuang#8223 | [Link](https://codepen.io/mwebwvuq-the-flexboxer/pen/KKREQvZ) | | christina#6185 | [Link](https://codepen.io/chrisc0210/pen/MWGxrRv) | --- 2. ### 閉包(Closure) > 11/2更新:可以從內部函式訪問外部函式的作用域(變數) * 讓函數有各自的變數,不會因為使用的變數名稱相同互相污染 * 可用匿名函式(return)的方式直接把值回傳出來 #### 範例 closure + return ``` //相同變數名稱 var count = 0; function redBoxs() { var count = 0; // 把原本函式改成匿名函式直接放進來 return function () { count += 1; console.log(count + 'red'); }; } function blueBoxs() { var count = 0; // 把原本函式改成匿名函式直接放進來 return function () { count += 1; console.log(count + 'blue'); }; } // const redFunc = redBoxs(); const blueFunc = blueBoxs(); // redFunc(); blueFunc(); ``` --- 3. ### 如何用 javaScript 顯示今日的日期 > [參考連結(Potatolee#7749提供)](https://www.runoob.com/js/js-obj-date.html) ``` //create date new Date(); new Date(value); new Date(dateString); new Date(year, monthIndex [, day [, hours [, minutes [, seconds [, milliseconds]]]]]); var today = new Date() var d1 = new Date("October 13, 1975 11:13:00") var d2 = new Date(79,5,24) var d3 = new Date(79,5,24,11,33,0) //setting date var myDate=new Date(); myDate.setFullYear(2010,0,14); var myDate=new Date(); myDate.setDate(myDate.getDate()+5); ``` > [參考連結(如何顯示在HTML上)](https://www.delftstack.com/zh-tw/howto/html/html-todays-date/) ``` <div> <script> date = new Date().toLocaleDateString(); document.write("Today: " + date); </script> </div> ``` --- 4. ### JavaScript 是「傳值」或「傳址」 * pass by value (傳值) ``` //基本型別 var priceMilk = 60; //牛奶價錢 var priceTea = priceMilk; //茶水價錢 priceMilk = 100; //重新賦予牛奶價錢 console.log(priceMilk); //100 consoel.log(priceTea); //60 ``` * pass by reference (傳址) ``` //物件型別 var objCarA = { color: 'red'} var objCarB = { color: 'red'}; var objCarC = objCarA; console.log(objCarA === objCarB); //false (如 0x001 === 0x003 => false) console.log(objCarA === objCarC); //true (如 0x001 === 0x001 => true) ``` | Name | link | | -------- | -------- | | hungya#0773 | [Link](https://eggplant-form-7a1.notion.site/JavaScript-JavaScript-5ce09317cba34184bc26a755191d2530) | --- ## 討論紀錄 ![](https://i.imgur.com/9FRzh2P.png) ![](https://i.imgur.com/oYjMrg8.png) ![](https://i.imgur.com/GNqgHiU.png) --- > 謝謝今天有參與的同學們 :100: <iframe src="https://giphy.com/embed/SL2TwiZJAvOhO" width="480" height="330" frameBorder="0" class="giphy-embed" allowFullScreen></iframe><p><a href="https://giphy.com/gifs/cat-funny-SL2TwiZJAvOhO"></a></p>