博文

目前显示的是标签为“編譯語言”的博文

JavaScript 核心觀念(9)-JS回收機制

图片
 今天要來簡單講一下,關於JS的回收機制究竟是什麼東西 主要的概念會是記憶體的存放與釋放 執行環境中,會創造屬於它的記憶體空間,離開執行環境時,釋放記憶體。 *會在沒有任何物件使用到的時候,回收記憶體。 以下是依些小撇步 需要一直使用 → 放全域變數 函式fn()內需要而已 → 放區域變數 consoel.log也會占用記憶體空間哦 *Chrome小工具 F12開啟開發者工具 → 選擇Memory頁籤 → 按下Take heap snapshot按鈕 可以看網頁佔用了多少記憶體哦。 『如果你能做你擅長的事同時又快樂, 你在生命中以走的比大多數人還遠。』-李奧納多.狄卡皮歐

JavaScript 核心觀念(8)-執行緒與同步、非同步

图片
 嗨,大家好 我是Kris,今天要來分享關於JS的執行緒、事件佇列是如何進行的 那就開始吧~ 單執行緒:一次只能做一件事,做完才會做下一件事,JS就是如此,像是單工的感覺。 多執行緒:可以同時執行多個任務。 同步:依照程式碼依序執行fn() 非同步:針對程式語言本身,放到最後才做。 如同上面範例,doWork()會依序執行三個fn(),且都要等上一個完成才能進行下一個。 非同步:因應JS的某些程式的特性,能達成非同步的樣子。 如同上方範例的setTimeout的用意是隔3秒再執行,JS的處理方式是會先放置事件佇列,讓我們繼續瞭解事件佇列是什麼吧! 事件佇列:非同步行為先移到事件佇列,JS還是依照同步的概念在執行程式碼哦! 依照之前分享過的執行堆疊的概念,會先進入do work()、接著eatBreakfast()完成後離開堆疊,再執行callSomeone() 由於callSomeone內有setTimeout屬於非同步事件,會先放到事件佇列Event Queue,也就是圖片中的右邊方格,等待同步執行結束後再進行。 *注意setTimeout不管秒數設定幾秒都是這樣執行,就算是0秒也是哦* 非同步的例子 addEventListener是屬於監聽事件,那範例寫的意思是當有人點擊時,再去執行clickThis 跟setTimeout一樣是一個非同步事件,會先放到事件佇列等待被點擊的時候才會觸發。 補充 事件佇列有多個非同步事件時 *setTimeout有確定秒數,就可以知道誰先執行 *如果沒有確定,其結果會是隨機的,可以用Promise解決 *AJAX也是非同步事件,需要等待回傳資料 *監聽事件是等使用者觸發才會執行 *非同步的概念是因為JS在執行需要呼叫其他資源時,不能準確知道他的完成時間,所以才會先放到事件佇列。 『用現在的努力,換自己喜歡的人生』

JavaScript 核心觀念(1)-JavaScript是如何運行的呢? (直譯語言、編譯語言的差異)

图片
哈囉大家好,我是Kris 今天要來分享課程中的第一堂課-JavaScript如何運行以及直譯語言與編譯語言的差異在哪裡 因為電腦無法直接看懂原始碼,也就是我們工程師所撰寫出來的程式碼 所以會經過一些處理來讓電腦瞭解以後再去運行。 直譯語言和編譯語言的差異 直譯語言:執行前未經編譯,像是JavaScript就是直譯語言哦。 好處:彈性比較高、不需要預先定義型別。 *錯誤會直接反映在環境中,ex:chrome裡的console 編譯語言:會預先編譯再運行。 好處:預先編譯就可以預先除錯、語言效能比較好。 *大多時候我們在說某種語言為編譯或直譯語言時,指的是【 大多數 】並非全部。 就像是我們說JavaScript是直譯語言,不代表JavaScript不能有編譯器,反之亦然。 JavaScript直譯器轉換過程 語法基本單元化(Tokenizing):將JS裡的標點符號、詞彙先分別解析出來。    *JS=JavaScript 抽象結構樹AST(Abstract Syntax Tree):將整個原始碼的結構定義出來。 代碼生成: 最後一步才會生成代碼。 生成出來的代碼會根據環境的不同稍微有不一樣的地方。 *在結構樹的階段尚未運行程式碼 可以利用這個網站來更深入的瞭解整個轉換過程👇 https://esprima.org/demo/parse.html# 接下來操作並解釋給大家看 首先在左側輸入程式碼 var 變數 = '內容'; 這邊我輸入的是【var ming = '小名';】 右側的頁籤選到Tokens,可以看到拆成了各個不同的標點符號以及詞彙。 Keyword是關鍵字,內容(value)為"var";Punctuator是標點符號。 有點像小時候寫作文時,需要先瞭解各個詞語的意思以及不同的標點符號代表什麼意思, Tokenizing就是在做這樣子的事情,先拆開分類但還不會瞭解我們是在定義一個變數。 點選最左側:結構樹Tree 轉換成電腦看得懂的方式,Tree有點像是JSON格式。 VariableDeclarator: 定義一個變數 kind:定義變數的方法是 var Identifier: 變數的字詞;name:內容是ming 然後把'小名'這個詞彙賦予進變數。 到這裡才會知道我們正在定義一個變...