抄別人的 以爲能夠 就mark了javascript
一、首先瀏覽器主進程接管,開了一個下載線程。
二、而後進行HTTP請求(DNS查詢、IP尋址等等),中間會有三次捂手,等待響應,開始下載響應報文。
三、將下載完的內容轉交給Renderer進程管理。
四、Renderer進程開始解析css rule tree和dom tree,這兩個過程是並行的,因此通常我會把link標籤放在頁面頂部。
五、解析繪製過程當中,當瀏覽器遇到link標籤或者script、img等標籤,瀏覽器會去下載這些內容,遇到時候緩存的使用緩存,不適用緩存的從新下載資源。
六、css rule tree和dom tree生成完了以後,開始合成render tree,這個時候瀏覽器會進行layout,開始計算每個節點的位置,而後進行繪製。
七、繪製結束後,關閉TCP鏈接,過程有四次揮手。css
css在加載過程當中不會影響到DOM樹的生成,可是會影響到Render樹的生成,進而影響到layout,因此通常來講,style的link標籤須要儘可能放在head裏面,由於在解析DOM樹的時候是自上而下的,而css樣式又是經過異步加載的,這樣的話,解析DOM樹下的body節點和加載css樣式能儘量的並行,加快Render樹的生成的速度。html
js腳本應該放在底部,緣由在於js線程與GUI渲染線程是互斥的關係,若是js放在首部,當下載執行js的時候,會影響渲染行程繪製頁面,js的做用主要是處理交互,而交互必須得先讓頁面呈現才能進行,因此爲了保證用戶體驗,儘可能讓頁面先繪製出來。前端
this,函數執行的上下文,能夠經過apply,call,bind改變this的指向。對於匿名函數或者直接調用的函數來講,this指向全局上下文(瀏覽器爲window,nodejs爲global),剩下的函數調用,那就是誰調用它,this就指向誰。固然還有es6的箭頭函數,箭頭函數的指向取決於該箭頭函數聲明的位置,在哪裏聲明,this就指向哪裏。html5
深拷貝和淺拷貝是針對複雜數據類型來講的,淺拷貝只拷貝一層,而深拷貝是層層拷貝。別是什麼?實現一個深拷貝java
深拷貝複製變量值,對於非基本類型的變量,則遞歸至基本類型變量後,再複製。 深拷貝後的對象與原來的對象是徹底隔離的,互不影響,對一個對象的修改並不會影響另外一個對象。node
淺拷貝是會將對象的每一個屬性進行依次複製,可是當對象的屬性值是引用類型時,實質複製的是其引用,當引用指向的值改變時也會跟着變化。es6
淺拷貝只最第一層屬性進行了拷貝,當第一層的屬性值是基本數據類型時,新的對象和原對象互不影響,可是若是第一層的屬性值是複雜數據類型,那麼新對象和原對象的屬性值其指向的是同一塊內存地址。
深拷貝實現json
1.深拷貝最簡單的實現是: JSON.parse(JSON.stringify(obj))跨域
JSON.parse(JSON.stringify(obj)) 是最簡單的實現方式,可是有一些缺陷:
1.對象的屬性值是函數時,沒法拷貝。
2.原型鏈上的屬性沒法拷貝
3.不能正確的處理 Date 類型的數據
4.不能處理 RegExp
5.會忽略 symbol
6.會忽略 undefined
2.實現一個 deepClone 函數
若是是基本數據類型,直接返回
若是是 RegExp 或者 Date 類型,返回對應類型
若是是複雜數據類型,遞歸。
考慮循環引用的問題
call 和 apply 的功能相同,都是改變 this 的執行,並當即執行函數。區別在於傳參方式不一樣。
func.call(thisArg, arg1, arg2, ...):第一個參數是 this 指向的對象,其它參數依次傳入。
func.apply(thisArg, [argsArray]):第一個參數是 this 指向的對象,第二個參數是數組或類數組。
一塊兒思考一下,如何模擬實現 call ?
首先,咱們知道,函數均可以調用call,說明 call 是函數原型上的方法,全部的實例均可以調用。即:
Function.prototype.call
在 call 方法中獲取調用 call() 函數
若是第一個參數沒有傳入,那麼默認指向window / global(非嚴格模式)
傳入 call 的第一個參數是 this 指向的對象,根據隱式綁定的規則,咱們知道 obj.foo(),foo() 中的 this 指向 obj;所以咱們能夠這樣調用函數 thisArgs.func(...args)
返回執行結果
apply 的實現思路和 call 一致,僅參數處理略有差異。以下:
Box 是 CSS 佈局的對象和基本單位,頁面是由若干個Box組成的。
元素的類型 和 display 屬性,決定了這個 Box 的類型。不一樣類型的Box 會參與不一樣的 Formatting Context。
Formatting Context
Formatting Context 是頁面的一塊渲染區域,而且有一套渲染規則,決定了其子元素將如何定位,以及和其它元素的關係和相互做用。
Formatting Context 有 BFC (Block formatting context),IFC (Inline formatting context),FFC (Flex formatting context) 和 GFC (Grid formatting context)。FFC 和 GFC 爲 CC3 中新增。
BFC佈局規則
計算BFC的高度時,浮動元素也參與計算。
如何建立BFC
display 爲 inline-block, table-cell, table-caption
BFC 的應用
1.防止 margin 重疊 (同一個BFC內的兩個相鄰Box的 margin 會發生重疊,觸發生成兩個BFC,即不會重疊)
2.清除內部浮動 (建立一個新的 BFC,由於根據 BFC 的規則,計算 BFC 的高度時,浮動元素也參與計算)
3.自適應多欄佈局 (BFC的區域不會與float box重疊。所以,能夠觸發生成一個新的BFC)