国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

有效提高JavaScript執(zhí)行效率的幾點(diǎn)知識(shí)

2019-11-20 13:16:04
字體:
供稿:網(wǎng)友

為了提供新鮮、別致的用戶體驗(yàn),很多網(wǎng)站都會(huì)使用 JavaScript 來改善設(shè)計(jì)、驗(yàn)證表單、檢查瀏覽器,以及Ajax請(qǐng)求,cookie操作等等,實(shí)現(xiàn)無刷新動(dòng)態(tài)效果 。但是,要將大量?jī)?nèi)容在瀏覽器呈現(xiàn),如果處理不好,網(wǎng)站性能將會(huì)急劇下降。所以我們有必要了解下,如何提高JavaScript的執(zhí)行效率。

JavaScript 函數(shù)

在JavaScript 中,函數(shù)在使用前會(huì)預(yù)編譯。盡管有些時(shí)候下可以使用字符串代替函數(shù),但是每次執(zhí)行這段JavaScript 代碼時(shí)都會(huì)重新解析,影響性能。

1、eval例子

復(fù)制代碼 代碼如下:

eval('output=(input * input)');
// 建議改成:
eval(new function() { output=(input * input)});

2、setTimeout例子

復(fù)制代碼 代碼如下:

setTimeout("alert(1)", 1000);
// 建議改成:
setTimeout(function(){alert(1)}, 1000);

使用函數(shù)代替字符串作參數(shù)確保新方法中的代碼能被 JavaScript 編譯器優(yōu)化。

JavaScript作用域

JavaScript作用域鏈中的每個(gè)作用域都包含幾個(gè)變量。理解作用域鏈很重要,這樣才能利用它。

復(fù)制代碼 代碼如下:

var localVar = "global"; //全局變量

function test() {

  var localVar = "local"; //局部變量

  //局部變量
  alert(localVar);

  //全局變量
  alert(this.localVar);

  //查找document在局部變量找不到,就查找全局變量
  var pageName = document.getElementById("pageName");
}

使用局部變量比使用全局變量快得多,因?yàn)樵谧饔糜蜴溨性竭h(yuǎn),解析越慢。下圖顯示了作用域鏈結(jié)構(gòu):

如果代碼中有 with 或 try-catch 語句,作用域鏈會(huì)更復(fù)雜,如下圖:

JavaScript字符串

JavaScript中一個(gè)非常影響性能的函數(shù)是字符串連接,一般情況都是使用 + 號(hào)來實(shí)現(xiàn)拼接字符串。但是早期瀏覽器沒有對(duì)這樣的連接方式做優(yōu)化,導(dǎo)致在連續(xù)創(chuàng)建和銷毀字符串嚴(yán)重降低JavaScript執(zhí)行效率。

復(fù)制代碼 代碼如下:

var txt = "hello" + " " + "world";

建議改成:

復(fù)制代碼 代碼如下:

var o = [];
o.push("hello");
o.push(" ");
o.push("world");
var txt = o.join();

我們?cè)俸?jiǎn)單封裝一下:

復(fù)制代碼 代碼如下:

function StringBuffer(str) {
    var arr = [];
    arr.push(str || "");
    this.append = function(str) {
        arr.push(str);
        return this;
    };
    this.toString = function() {
        return arr.join("");
    };
};

然后這樣子調(diào)用:

復(fù)制代碼 代碼如下:

var txt = new StringBuffer();
txt.append("Hello");
txt.append(" ");
txt.append("World");
alert(txt.toString());

JavaScript DOM操作

HTML Document Object Model (DOM) 定義了訪問和操作 HTML 文檔的標(biāo)準(zhǔn)方法。它將 HTML 文檔表示成節(jié)點(diǎn)樹,其中包含元素、屬性和文本內(nèi)容。通過使用 HTML DOM,JavaScript 能訪問 HTML 文檔中所有節(jié)點(diǎn)并操作它們。

DOM重繪

每次修改到頁面的DOM對(duì)象,都涉及到DOM重繪,瀏覽器都會(huì)重新渲染頁面。所以降低DOM對(duì)象的修改次數(shù),可以有效地提高JavaScript 的性能。

復(fù)制代碼 代碼如下:

for (var i = 0; i < 1000; i++ ) {
  var elmt = document.createElement('p');
  elmt.innerHTML = i;
  document.body.appendChild(elmt);
}

建議改成:

復(fù)制代碼 代碼如下:

var html = [];
for (var i = 0; i < 1000; i++) {
  html.push('<p>' + i + '</p>');
}
document.body.innerHTML = html.join('');

DOM訪問

通過DOM可以訪問到HTML文檔中的每個(gè)節(jié)點(diǎn)。每次調(diào)用getElementById()、getElementsByTagName()等方法,都會(huì)重新查找并訪問節(jié)點(diǎn)。所以將查找到的DOM節(jié)點(diǎn)緩存一下,也可以提高JavaScript 的性能。

復(fù)制代碼 代碼如下:

document.getElementById("p2").style.color = "blue";
document.getElementById("p2").style.fontFamily = "Arial";
document.getElementById("p2").style.fontSize = "larger";

建議改成:

復(fù)制代碼 代碼如下:

var elmt = document.getElementById("p2");
elmt.style.color = "blue";
elmt.style.fontFamily = "Arial";
elmt.style.fontSize = "larger";

DOM遍歷

DOM遍歷子元素通常都是按索引循環(huán)讀取下一個(gè)子元素,在早期瀏覽器下這種讀取方式執(zhí)行效率很低,利用nextSibling方式可以提高js遍歷DOM的效率。

復(fù)制代碼 代碼如下:

var html = [];
var x = document.getElementsByTagName("p");//所有節(jié)點(diǎn)
for (var i = 0; i < x.length; i++)  {
  //todo
}

建議改成:

復(fù)制代碼 代碼如下:

var html = [];
var x = document.getElementById("div");//上級(jí)節(jié)點(diǎn)
var node = x.firstChild;
while(node != null){
  //todo
  node = node.nextSibling;
}

JavaScript 內(nèi)存釋放

在web應(yīng)用中,隨著DOM對(duì)象數(shù)量的增加,內(nèi)存消耗會(huì)越來越大。所以應(yīng)當(dāng)及時(shí)釋放對(duì)象的引用,讓瀏覽器能夠回收這些內(nèi)存。

釋放DOM占用的內(nèi)存

復(fù)制代碼 代碼如下:

document.getElementById("test").innerHTML = "";

將DOM元素的innerHTML設(shè)置為空字符串,可以釋放其子元素占用的內(nèi)存。

釋放javascript對(duì)象

復(fù)制代碼 代碼如下:

//對(duì)象:
obj = null
//對(duì)象屬性:
delete obj.property
//數(shù)組元素:
arr.splice(0,3);//刪除前3個(gè)元素

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 布拖县| 依兰县| 吉木萨尔县| 丹凤县| 通道| 通江县| 阿尔山市| 罗平县| 中超| 车致| 房山区| 麻江县| 吉隆县| 广东省| 安塞县| 鲁山县| 抚宁县| 澄江县| 滦南县| 奉化市| 子长县| 昭苏县| 长垣县| 鹤峰县| 炎陵县| 马鞍山市| 玛曲县| 隆德县| 清河县| 达尔| 黄大仙区| 海伦市| 策勒县| 炉霍县| 崇礼县| 合山市| 阿克陶县| 大悟县| 阳朔县| 平凉市| 徐州市|