當瀏覽器遇到一個 script 標記時,DOM 構建將暫停,直至腳本完成執行,而後繼續構建DOM。每次去執行JavaScript腳本都會嚴重地阻塞DOM樹的構建,若是JavaScript腳本還操做了CSSOM,而正好這個CSSOM尚未下載和構建,瀏覽器甚至會延遲腳本執行和構建DOM,直至完成其CSSOM的下載和構建。promise
因此,script 標籤的位置很重要。實際使用時,能夠遵循下面兩個原則:瀏覽器
DOM結構中的每一個元素都有本身的盒模型,這些都須要瀏覽器根據各類樣式來計算並根據結果將元素放到它該出現的位置,這個過程叫作reflowbash
當各類盒子的位置、大小以及其餘屬性改動,例如字體大小顏色等都肯定下來之後,瀏覽器就把這個元素按照各自的特性繪製了一遍,因而頁面內容就出現了,這個過程叫作repaintdom
將DOM改動或者CSS改動儘量的一次性改完,不要一次操做分屢次進行 例子:異步
//屢次重繪
dom1.style.backgroundColor = 'red'
dom1.style.width= '50px'
dom1.style.height= '50px'
//一次重繪
//CSS
.add{
backgound-color: red;
width: 50px;
heiht: 50px;
}
//JS
dom2.className = 'add'
複製代碼
console.log(1)
setTimeout(function() {
console.log(3)
}, 0)
console.log(2)
//輸出順序爲 1 2 3 由於setTimeout是一個異步函數
複製代碼
console.log(1)
setTimeout(function() {
console.log(2)
}, 0)
while (true) {
}
//只輸出1而後進入無線循環不輸出2
複製代碼
驗證了全部同步操做完成以前異步操做是不會被執行的。函數
for(var i = 0;i < 4;i++) {
setTimeout(function() {
console.log(i)
},1000)
}
//輸出四個4
複製代碼
上面這段代碼同時輸出4個4.由於在循環的過程當中遇到setTimeout會記住這個函數,可是不會去執行他,而後進入下一輪循環,等到循環結束,setTimeout被放入異步隊列執行。oop