瀏覽器遍歷 DOM 元素的代價(jià)是昂貴的。最簡(jiǎn)單優(yōu)化 DOM 樹(shù)查詢的方案是,當(dāng)一個(gè)元素出現(xiàn)多次時(shí),將它保存在一個(gè)變量中,就避免多次查詢 DOM 樹(shù)了。
// Recommended
var myList = "";
var myListHTML = document.getElementById("myList").innerHTML;
for (var i = 0; i < 100; i++) {
myList += "<span>" + i + "</span>";
}
myListHTML = myList;
// Not recommended
for (var i = 0; i < 100; i++) {
document.getElementById("myList").innerHTML += "<span>" + i + "</span>";
}
循環(huán)無(wú)疑是和 JavaScript 性能非常相關(guān)的一部分。通過(guò)存儲(chǔ)數(shù)組的長(zhǎng)度,可以有效避免每次循環(huán)重新計(jì)算。
注: 雖然現(xiàn)代瀏覽器引擎會(huì)自動(dòng)優(yōu)化這個(gè)過(guò)程,但是不要忘記還有舊的瀏覽器。
var arr = new Array(1000),
len, i;
// Recommended - size is calculated only 1 time and then stored
for (i = 0, len = arr.length; i < len; i++) {
}
// Not recommended - size needs to be recalculated 1000 times
for (i = 0; i < arr.length; i++) {
}
當(dāng)你無(wú)法保證嵌入第三方內(nèi)容比如 Youtube 視頻或者一個(gè) like/tweet 按鈕可以正常工作的時(shí)候,你需要考慮用異步加載這些代碼,避免阻塞整個(gè)頁(yè)面加載。
(function() {
var script,
scripts = document.getElementsByTagName('script')[0];
function load(url) {
script = document.createElement('script');
script.async = true;
script.src = url;
scripts.parentNode.insertBefore(script, scripts);
}
load('//apis.google.com/js/plusone.js');
load('//platform.twitter.com/widgets.js');
load('//s.widgetsite.com/widget.js');
}());
更多建議: