DOM樹+CSS規則樹—>渲染樹—調用系統GUI的API來繪製頁面
1)瀏覽器下載html文件以後,會根據html文件構建DOM樹,其中css會構建css規則樹,js會修改dom樹和css規則樹;
2)經過計算css樣式,造成渲染樹,而後進行佈局和繪製頁面;
3)CSS文件要放在頂部,JS文件要放在底部。由於當CSS文件放在頂部時,頁面會逐步呈現,有較好的用戶體驗,若是將CSS文件放在底部,瀏覽器爲了不迴流,會阻塞內容的呈現。可能致使白屏和內容閃爍的狀況。JS文件要放在底部是由於JS文件可能對DOM樹進行修改,因此瀏覽器在加載JS文件時是阻塞的。而其餘文件均可以並行下載。JS文件若是放在頂部會阻塞內容的逐步呈現,而且阻塞後面組件的下載。
4)迴流reflow和重繪repaint
因爲html默認採用的是流式佈局,因此當元素的幾何尺寸發生變化時,會產生迴流。迴流會從當前元素遞歸往下從新計算元素的位置。好比說對DOM進行增、刪、改、移動或者動畫、還有resize時都會觸發迴流reflow。
而當元素幾何尺寸沒有發生變化,僅僅是顏色和背景色發生變化時,會產生重繪。
瀏覽器會對某些操做進行異步迴流
避免迴流:不要一條一條修改樣式,能夠預先定義好class的css而後修改類名;對DOM進行離線修改;儘可能修改層級較低的DOM;爲動畫的組件採用非流式佈局;不使用table佈局;css
原理:找出再也不使用的變量,而後釋放其佔用的內存(垃圾收集器週期性地執行)
垃圾回收 html
方法:
1) 標記清除:目前主流的垃圾收集算法,將當前不使用的值加上標記,而後進行內存回收。(經過變量在執行環境中的生存週期)
2) 引用計數:記錄全部值被引用的次數,當引用次數爲0時,進行內存回收。存在的問題:循環引用會致使內存泄露。因此最好手動解除引用。前端
說明:
1) 在標記清除時,如何肯定變量再也不被使用?
JS中分爲全局執行環境和函數的執行環境,代碼運行時,會先將全局執行環境壓入棧中,而後當執行流進入函數時,會建立函數的執行環境和相應的做用域鏈。
每一個函數都有本身的執行環境,對應着相應的做用域鏈。對變量的查找和賦值都沿着本身的做用域鏈向上查找。
建立函數時,會建立一個預先包含全局變量對象的做用域鏈;當執行函數時,會建立本地活動對象(包括arguments和局部變量),並將其推入做用域鏈前端。當執行函數時,對變量的查找會沿着做用域鏈向上搜索,直到做用域鏈的最頂端—全局變量對象。當函數執行完畢後,本地活動對象會在內存中銷燬。而閉包中,當外層函數執行完畢後,外層函數的做用域鏈被銷燬,但被閉包函數引用的活動對象還存在內存中。
不肯定:任何函數(包括閉包函數)在執行完畢後,只能銷燬本地活動對象,因此爲了銷燬閉包引用的活動對象,須要銷燬閉包函數,即解除引用null。git
2) 如何引用計數?
將引用類型值賦給已聲明的變量,引用計數加1,若該變量的值變爲了其餘,則引用計數值減1。當引用計數爲0時,進行內存回收。github
自我理解代碼執行過程:將全局執行環境推入執行棧中,將全部var 變量和函數聲明提高到其做用域的頂部,建立函數時,會建立一個預先包含全局變量對象的做用域鏈;而後從第一行代碼開始順序執行,全部函數都會當函數執行時,則將函數的執行環境推入棧中,並造成其做用域鏈,函數在聲明時會造成一個包含全局對象的做用域鏈,當函數執行時,會將當前活動對象加入到做用域鏈中,對變量的查找都是沿着做用鏈進行查找的。算法
性能問題:垃圾收集器的執行間隔:IE6根據內存分配量運行,當內存量大時,通常整個程序所須要的內存量就很大,這樣會形成垃圾收集器的頻繁執行。IE7重寫了以後採用的規則:觸發垃圾收集的臨界值動態變化。初始觸發垃圾收集的臨界值與IE6相同,若回收的內存分配量低於15%,則臨界值加倍;若回收的內存分配量大於85%,則臨界值保持不變。chrome
IE(Trident);firefox(Gecko);Safari和chrome(WebKit);Opera(Presto)後端
GBK、Unicode、ASCII碼 都爲字符集,UTF-8爲編碼方式;
ASCII碼一共規定了128個字符的編碼;
GBK包含所有中文字符;2個字節表示中文;
unicode 中全部符號都全球惟一;
UTF-8做爲Unicode的實現方式之一,包含全世界全部國家須要用到的字符。一個字節表示英文,3個字節表示中文。UTF8佔用的數據庫比GBK大。 瀏覽器