---
# System prepended metadata

title: 前端工程師面試題 Day2
tags: [面試]

---

# 前端工程師面試題 Day2
###### tags: `面試`
## Q1. 甚麼是閉包?
當在函式裡宣告變數，並回傳一個函式，當外層函式執行結束，還能透過回傳的函式，讀取到外層函式內的變數。
內層變數不會被釋放，又不會被外面讀取。

好處：可以將不想被改變的變數用閉包的方式儲存，不能被外部改變，但是可以讀取。變數僅存在於函式中。

閉包是由函式及其相關參照環境組合而成的實體。

所有函式都式閉包，直接來看效果的話，假設變數被宣告在一個外部函式裡，當這個函式執行完後，照理說沒辦法在函式外部讀取到變數，但是可以透過外部函式回傳一個內部函式，去讀取到變數。

### 參考
https://jim1105.coderbridge.io/2022/07/25/closure-scope/


## Q2. 請說明 inline 和 inline-block 的差異性
1. inline
    * 不可設定長寬，元素的寬高由他的內容撐開。
    * 設定 margin/padding 排版不會改變，其它行不會被推開。
2. inline-block
    * inline 方式呈現，也就是元素可在同一行內呈現，但同時有 block 的屬性，也就是可以設定元素之寬高，設定 margin/padding 會佔據空間。

常見 inline element：span、a、 input、img、button

### 參考
https://ytclion.medium.com/css%E6%95%99%E5%AD%B8-%E9%97%9C%E6%96%BCdisplay-inline-inline-block-block%E7%9A%84%E5%B7%AE%E5%88%A5-1034f38eda82

## Q3. 什麼是 "use strict";? 使用他的優點和缺點是什麼？
是 JavaScript ES5 加入的標準，目的是為了讓編寫程式碼更穩定。
1. 未定義變數不能直接賦值。
3. 禁止使用 delete 刪除變數或函式。
4. 禁止重複變數名稱。
5. 物件內有重複屬性。
6. eval、arguments 不能當作變數名稱。
7. 可以僅用在函式內。
8. this 不再指向全域，而是 undefined。

1. 優點：讓程式碼更穩定安全。
2. 缺點：如果是十分成熟的大專案或舊專案，突然使用 strict mode 可能會導致專案無法運作。

### 參考
https://www.casper.tw/javascript/2017/12/15/javascript-use-strict/

## Q4. 請解釋 淺拷貝 和 深拷貝?
深拷貝就是完全的複製變數，不會因為改變原始變數就受影響，基本型別的拷貝都是身拷貝。
而淺拷貝主要發生在 object 跟 array ，當 object 或 array 裡面有任何一層的參照資料位置是相同的，就會是淺拷貝。

深拷貝的方法：JSON.parse(JSON.stringify(arr/obj))

轉換過程中的錯誤：
1. undefined 連同 key 一起消失。
2. NaN 會轉成 null
3. infinity 轉成 null
4. regExp 轉成 {}
5. Date 由 data 轉成 string

lodash cloneDeep深拷貝且不會有轉換問題

淺拷貝(shallow copy) : 原始物件資料與複製物件資料「並非完全獨立」，可能第一層就有指向相同地址的資料，也可能第二層才有指向相同地址的資料。彼此資料內容的改變可能會互相影響。

深拷貝(deep copy) : 原始物件資料與複製物件資料「完全獨立」，沒有任何一層資料指向相同的地址。彼此資內容料的改變不會互相影響。

### 參考
https://www.programfarmer.com/articles/javaScript/javascript-shallow-copy-deep-copy

## Q5. styled-component vs. css module

### 參考
https://molly1024.medium.com/css-modules-%E6%98%AF%E4%BB%80%E9%BA%BC-%E7%82%BA%E4%BB%80%E9%BA%BC%E6%88%91%E8%A6%81%E6%94%B9%E7%94%A8-css-modules-what-is-css-modules-why-should-you-use-it-aeb7d2955c58
## Q6. 什麼是 event loop

event loop 將費時較久或是等待事件才能啟動的任務往後安排，為的就是讓網頁流暢。好的使用者體驗。

event loop 的作用就是監控堆疊 call stack 和 task queue ，當 API 執行完會將 call back FN 放到 task queue 當 event loop 偵測到 task queue 空的話，就把 task queue 裡面從第一個開始丟到 call stack

### 參考
https://pjchender.dev/javascript/js-event-loop-stack-queue/

https://ithelp.ithome.com.tw/articles/10241081