iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 1
0
Modern Web

JavaScript Note系列 第 1

生命週期

  • 分享至 

  • xImage
  •  

前言

為什麼要參加鐵人賽?每個人的答案不盡相同,我呢?因為之前JS學得2266,導致開發專案時一直碰壁,有問題就Google,就算問題解決了,卻還是不知問題的根源,下次再遇到,還是一樣。想必有很多人都有類似的經歷,尤其是初學者,如此的惡性循環讓我痛定思痛,我要學好JavaScript!!!

參加鐵人賽,是希望能藉此將我所學的,藉由文字表達出來。唯有透過表達,不管是文字或是言語,才能釐清觀念,而不是心裡那種模模糊糊、似懂非懂的概念。

正在看這篇文章的非參賽者,也許你也想參與,但因為工作因素,或是看了他人文章,認為自己寫的搬不上檯面,亦認為自己不善表達,這些因素而放棄。我身邊也有這樣的人,我鼓勵他們,當你想要達成一件目標的時候,如果決心夠堅定,時間根本不是問題。也不要擔心文章太簡單,沒有內容,寫錯被噹,試問,哪個資深的前輩不是這樣過來的呢?萬丈高樓平地起阿!不過目前看來,只有我參賽XD。

這系列的文章,我會把它定位在筆記的形式,不只是寫給各位看的,更是寫給我自己看的。
當中,或許有些地方解釋不盡完善,觀念錯誤,請各位不吝指教,
最後希望這JS筆記,能幫助一同在路上奮鬥的夥伴。

正題

使用者在瀏覽器網址列,輸入網址(url),送出請求(request)至網路伺服器。伺服器收到請求後,根據請求的內容,回傳一份由JS、HTML、CSS構成的訊息。

瀏覽器收到後,開始解析,進入建立Web頁面的階段。首先解析HTML,建立DOM,並儲存於記憶體中。套用CSS樣式,若無,則套用預設樣式於HTML,根據HTML與CSS的描述,呈現頁面。

建立頁面的時候,如遇到script元素,表示這段內容是用來執行JS程式碼的,這時,瀏覽器會停止載入HTML,瀏覽器內部的JS引擎會執行JS程式碼。

<p>JS執行前</p>
    <script src="./app.js"></script>
<p>JS執行後</p>

●在兩段HTML元素之間插入script元素,觀察執行過程,首先會顯示:
https://ithelp.ithome.com.tw/upload/images/20181016/20112573GrurDn9VZv.jpg

●當解析到script元素,瀏覽器會進入JS並且執行:
https://ithelp.ithome.com.tw/upload/images/20181016/20112573M6tVuYY040.png

●直到按下確定,這段JS才算執行完畢,繼續解析剩餘的HTML成DOM:
https://ithelp.ithome.com.tw/upload/images/20181016/201125738iW6yWXCYh.png

如果再遇到script元素,就重複剛剛的步驟。

以上為建立頁面的過程,接下來進入Web應用程式的第二個步驟:事件處理。

JS讓網頁具有互動性,所謂的互動性是指,針對不同的事件觸發產生不同的反應,譬如點擊滑鼠、滾動卷軸、計時限制、按下特定鍵盤之類的,那要怎麼知道這些的事件被觸發呢?

我們可以在剛剛的第一階段設置事件監聽器,在整個Web應用程式生命週期結束之前,事件監聽器會一直監控Web中是否有指定的事件觸發。

當有事件觸發的時候,它的過程是這樣的:
事件會依發生的順序放入事件佇列中,事件佇列可以看成一個容器,裡面放著待處理的事件。
瀏覽器會一直檢查事件佇列是否有待辦事件,如有,它會依照放入的先後順序處理,該事件處理完成,將之移出佇列,繼續處理下一個事件,直到全部處理完畢,再繼續監控佇列,直到又有新的事件進入,它又再次處理,一直循環此過程。

瀏覽器執行JS的過程,是單執行緒(single-threaded),也就是說,它一次只能處理一個事件,當有數個事件時,就只能排排站,讓瀏覽器依序處理,為了因應這樣的特性,才有事件佇列的機制。
以下為範例。

HTML

<p>滑鼠水平座標:<span id="position"></span> </p>
<p>滑鼠點擊次數:<span id="count">0</span> </p>
<script src="./app.js"></script>

JS

var x = 1;
document.addEventListener("mousemove", function (e) {
    document.getElementById('position').textContent = e.clientX;
})
document.addEventListener('click', function () {
    document.getElementById('count').textContent = x++;
})

我們設置2個事件,分別是監聽滑鼠水平移動的座標以及點擊次數。

在生命週期第一階段頁面建置完成後,進入第二階段,事件處理。假設我們移動滑鼠後再點擊,這兩個事件會依序進入事件佇列中,瀏覽器再從事件佇列中先處理水平移動的座標,完成後,將事件移出佇列,再處理點擊次數,完成再移出佇列。關於佇列的細節,我們會在同步與非同步再說明,這邊只要記得事件會進入佇列,等待瀏覽器處理。

以上就是Web應用程式的生命週期,第二階段會一直循環,直到我們把瀏覽器關掉,它的生命週期也隨之結束。

參考來源:
忍者:JavaScript開發技巧探秘 第二章


下一篇
String 字串
系列文
JavaScript Note31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Ryan Lee
iT邦新手 4 級 ‧ 2018-10-31 19:19:04

抱歉 冒昧請問您 事件佇列(queue) 這個用法是從哪裡引用來的呢?

目前我查到的大部分都是 任務佇列(task queue),而且也不會縮寫成 (queue)

這個說法是 忍者:JavaScript開發技巧探秘 第二章 裡面有的嗎?

看更多先前的回應...收起先前的回應...
WM iT邦新手 3 級 ‧ 2018-10-31 20:23:12 檢舉

你指的是
事件會依發生的順序放入事件佇列(queue)中,事件佇列可以看成一個容器,裡面放著待處理的事件。
這段?

Ryan Lee iT邦新手 4 級 ‧ 2018-10-31 20:25:48 檢舉

不是 單純 事件佇列(queue) 這個說法

WM iT邦新手 3 級 ‧ 2018-10-31 20:36:34 檢舉

我先聲明,我的的確確沒有抄襲,這部分你誤會了
有疑慮的部分,我會持續跟你溝通,直到你解開誤解
解釋事件佇列(queue)的段落是我自己打的,
事件佇列(queue)這個用詞,可能不是很正確,我剛查過的確是任務佇列(task queue)居多,
我想釐清你的意思是?觀念有抄襲?

Ryan Lee iT邦新手 4 級 ‧ 2018-10-31 20:51:36 檢舉

重點來了,我也用 事件佇列(queue) 這個用詞,這麼巧您自己打也會和我一樣喔?

Ryan Lee iT邦新手 4 級 ‧ 2018-10-31 20:52:15 檢舉
WM iT邦新手 3 級 ‧ 2018-10-31 21:00:39 檢舉

所以這算抄襲?那只能請主辦單位評判了
我沒抄襲,就這樣

Ryan Lee iT邦新手 4 級 ‧ 2018-10-31 21:08:51 檢舉

很遺憾地,不是通篇一樣,所以要證明抄襲需要走法律途徑,主辦單位無法評斷。

但您自己摸著良心說,內容完全沒有參考到我的文章嗎?

WM iT邦新手 3 級 ‧ 2018-10-31 21:11:49 檢舉

話已至此..............

0
WM
iT邦新手 3 級 ‧ 2018-11-01 15:49:50

大家來心平氣和來談吧,針鋒相對不能解決問題。
function部分,我在參考書籍的時候,內容順序就隨著書的章節排下來,篇排順序跟書一樣。
事件佇列(queue),說實話,我只知道原理,沒特別注意名稱就很自然而然地打出來,
跟你同名,網路又找不到相同的,真的只是單純巧合。
如果我真的要抄襲,不會只抄'事件佇列(queue)'這幾個字,也不會只用一次。
而是把整篇文章COPY過來,然後玩文字遊戲,改改文字,讓文章看起來不要相同就好。
若你真的介意,我可以改掉。
至於字串跟陣列的範例,我有參考MDN,可能才讓你誤解。
直到你告知這件事,我才看過你文章,之前完全沒看過。
不管怎樣,你我都素昧平生,大家都是因為熱愛這技術,才藉由鐵人賽挑戰自己,分享自己所學的,不是嗎?
我希望能把時間花在提升自己,進而為前端的學習風氣,注入正能量。
若因此交惡,相信彼此不都樂見。
我能說的,都說了,接受與否在於你,若接受了,大家就當交個朋友吧。

我要留言

立即登入留言