亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > XML > 正文

解讀優化 JavaScript 代碼

2024-09-05 20:54:38
字體:
來源:轉載
供稿:網友

作者: Gregory Baker, GMail 軟件工程師 和 Erik Arvidsson, Google Chrome 軟件工程師

需要的經驗: JavaScript 相關工作知識

客戶端腳本能讓你的應用更加地動態和活躍, 但是瀏覽器對代碼的解析可能造成效率問題, 而這種性能差異在客戶端之間也不盡相同。 這里我們討論和給出一些優化你的 JavaScript 代碼的提示和最佳實踐。

使用字符串

字符串連接操作會對 Internet Explorer 6 和 7 的垃圾收集帶來很大的影響。 盡管這個問題在 Internet Explorer 8 里面得到解決 -- 字符串連接在 IE8 和其它非 IE 瀏覽器(如 Chrome)中稍微更有效率一點 -- 如果你的用戶中有很大一部分在使用 Internet Explorer 6 或 7, 你就需要非常注意你構建字符串的方式了。

有如下示例代碼:

以下為引用的內容:

var veryLongMessage =
'This is a long string that due to our strict line length limit of'
maxCharsPerLine
' characters per line must be wrapped. '
percentWhoDislike
'% of engineers dislike this rule. The line length limit is for '
' style purposes, but we don't want it to have a performance impact.'
' So the question is how should we do the wrapping?';

比起用連接的方式, 嘗試使用 join():

以下為引用的內容:

var veryLongMessage =
['This is a long string that due to our strict line length limit of',
maxCharsPerLine,
' characters per line must be wrapped. ',
percentWhoDislike,
'% of engineers dislike this rule. The line length limit is for ',
' style purposes, but we don't want it to have a performance impact.',
' So the question is how should we do the wrapping?'
].join();

相似的, 用連接的方式在條件語句和循環中構建字符串是很低效的. 錯誤的方式:

var fibonacciStr = '前 20 個斐波那契數 ';
for (var i = 0; i < 20; i++) {
fibonacciStr += i + ' = ' + fibonacci(i) + '
';
}

正確的方法:

var strBuilder = ['前 20 個斐波那契數:'];
for (var i = 0; i < 20; i++) {
  strBuilder.push(i, ' = ', fibonacci(i));
}
var fibonacciStr = strBuilder.join('');

構建通過輔助函數生成的字符串

通過傳遞字符串構建器(可以是數組或者輔助類)到函數中構建長字符串, 以避免出現存放臨時結果的字符串.

例如, 假定 buildMenuItemHtml_ 需要用文字串和變量構建一個字符串, 并且會在內部使用一個字符串構建器, 與其使用:

var strBuilder = [];
for (var i = 0; i < menuItems.length; i++) {
  strBuilder.push(this.buildMenuItemHtml_(menuItems[i]));
}
var menuHtml = strBuilder.join();

不如用:

var strBuilder = [];
for (var i = 0; i < menuItems.length; i++) {
  this.buildMenuItem_(menuItems[i], strBuilder);
}
var menuHtml = strBuilder.join();

定義類的方法

下面的代碼效率不高, 因為每次構造 baz.Bar 的實例時, 都會為 foo 創建一個新函數和閉包(closure):

baz.Bar = function() {
  // 構造函數代碼
  this.foo = function() {
  // 方法代碼
  };
}

推薦的方式為:

baz.Bar = function() {
  // 構造函數代碼
};

baz.Bar.prototype.foo = function() {
  // 方法代碼
};

用這種方式, 無論構造了多少個 baz.Bar 實例, 只會創建一個函數給 foo, 同時不會創建任何閉包.

初始化實例變量

將帶有值類型(非引用的)的初始化值(例如類型為數字, 布爾值, null, undefined 或字符串的值)的變量聲明/初始化代碼直接放在 prototype 原型中. 這可以避免每次調用構造函數時不必要地運行初始化代碼. (這個方法無法應用到初始化值由構造器參數決定或構造時狀態不確定的實例變量上.)

例如, 比起寫:

foo.Bar = function() {
  this.prop1_ = 4;
  this.prop2_ = true;
  this.prop3_ = [];
  this.prop4_ = 'blah';
};

不如寫:

foo.Bar = function() {
  this.prop3_ = [];
};

foo.Bar.prototype.prop1_ = 4;

foo.Bar.prototype.prop2_ = true;

foo.Bar.prototype.prop4_ = 'blah';

謹慎地使用閉包(closure)

閉包是 JavaScript 中一個強大而有用的特性; 但是, 它們也有不好的地方, 包括:

  • 它們是最常見的內存泄漏源頭.
  • 創建一個閉包比創建一個沒有閉包的內聯函數明顯要慢, 比起重用一個靜態函數則更慢. 例如:

    function setupAlertTimeout() {
      var msg = '要顯示的消息';
      window.setTimeout(function() { alert(msg); }, 100);
    }

    比下面的代碼慢:

    function setupAlertTimeout() {
      window.setTimeout(function() {
        var msg = '要顯示的消息';
        alert(msg);
      }, 100);
    }

    更比下面的代碼慢:

    function alertMsg() {
      var msg = '要顯示的消息';
      alert(msg);
    }

    function setupAlertTimeout() {
      window.setTimeout(alertMsg, 100);
    }
  • 他們增加了作用域鏈(scope chain)的層級. 當瀏覽器解析屬性時, 作用域鏈的每一個層級都必須被檢查一次. 在下面的例子中:

    var a = 'a';

    function createFunctionWithClosure() {
      var b = 'b';
      return function () {
        var c = 'c';
        a;
        b;
        c;
      };
    }

    var f = createFunctionWithClosure();
    f();

    f 被調用時, 引用 a 比引用 b 慢, 它們都比引用 c 要慢.

查看 IE+JScript Performance Recommendations Part 3: JavaScript Code inefficiencies 獲得更多有關在 IE 中使用閉包的信息.

避免使用 with

在你的代碼中避免使用 with. 它對性能有非常壞的影響, 因為它修改了作用域鏈, 讓查找在其它作用域的變量變得代價高昂.

避免瀏覽器內存泄漏

內存泄漏對 Web 應用而言是個很普遍的問題, 它會帶來嚴重的性能問題. 當瀏覽器的內存使用上升時, 你的 Web 應用, 連同用戶系統的其他部分, 都會變慢. Web 應用最常見的內存泄漏原因是: 在 JavaScript 腳本引擎和瀏覽器 DOM 的 C++ 對象實現間的循環引用(例如, 在 JavaScript 腳本引擎和 Internet Explorer 的 COM 基礎架構間, 或者 JavaScript 引擎和 Firefox 的 XPCOM 基礎架構間).

下面是避免內存泄漏的一些經驗法則:

使用一個事件系統來附加事件處理函數

最常見的循環引用模式 [ DOM 元素 --> 事件處理函數 --> 閉包作用域 --> DOM ] 在 這篇 MSDN 的 Blog 文章中討論過了. 為避免這個問題, 可以使用一個經過嚴格測試的事件系統來附件事件處理函數, 例如 Google doctype, Dojo, or JQuery.

另外, 在 IE 中使用內聯(inline)的事件處理函數會導致另外一類泄漏. 這不是通常的循環引用泄漏, 而是內存中臨時匿名腳本對象的泄漏. 詳情請查看 理解和解決 IE 泄漏模式(Understanding and Solving Internet Explorer Leak Patterns) 的 "DOM 插入順序泄漏模型(DOM Insertion Order Leak Model)" 一節, 另外在 JavaScript Kit 教程 中還有一個例子.

避免使用擴展(expando)屬性

擴展屬性是附加到 DOM 元素上的任意 JavaScript 屬性, 也是循環引用的常見原因. 你能夠在使用擴展屬性時不導致內存泄漏, 但是很容易不小心就引入一個泄漏. 這個泄漏的模式是 [ DOM 元素 --> 擴展屬性 --> 中間對象 --> DOM 元素 ]. 最好的方法就是避免使用它們. 如果你要使用它們, 就只使用簡單的值類型. 如果你要非簡單的類型, 那么在不再需要擴展屬性時將它設為空(null). 參見 理解和解決 IE 泄漏模式(Understanding and Solving Internet Explorer Leak Patterns) 中的 "循環引用(Circular References)" 一節.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人网免费视频| 国产精品色婷婷视频| 在线一区二区日韩| 国产亚洲欧美日韩一区二区| 国产精品av免费在线观看| 欧美韩国理论所午夜片917电影| 亚洲男女性事视频| 日本道色综合久久影院| 在线精品高清中文字幕| 91精品国产色综合久久不卡98口| 日韩精品免费在线视频观看| 亚洲视频第一页| 成人激情视频免费在线| 91免费的视频在线播放| 欧美激情精品久久久久久大尺度| 国产一区二区免费| 国产精品成人观看视频国产奇米| 精品欧美国产一区二区三区| 中日韩美女免费视频网站在线观看| 久久免费国产精品1| 久久精品国产清自在天天线| 精品二区三区线观看| 日本道色综合久久影院| 亚洲欧洲日本专区| 欧美精品激情blacked18| 欧美在线中文字幕| 国模极品一区二区三区| 欧美成人在线免费| 久久影视三级福利片| 中文字幕亚洲一区| 国产日韩精品在线播放| 色综合伊人色综合网站| 国产精品444| 午夜精品福利在线观看| 亚洲欧美一区二区三区情侣bbw| 综合国产在线观看| 91精品国产免费久久久久久| 亚洲丝袜av一区| 夜色77av精品影院| 欧美成人性色生活仑片| 97精品国产97久久久久久免费| 精品久久久香蕉免费精品视频| 国产精品成人免费视频| 欧美成人中文字幕在线| 夜夜嗨av色综合久久久综合网| 91探花福利精品国产自产在线| 欧美日韩国产中文精品字幕自在自线| 亚洲欧美日韩图片| 久久精品国产久精国产思思| 国模吧一区二区| 欧美超级免费视 在线| 九九热这里只有在线精品视| 亚洲国产成人av在线| 正在播放亚洲1区| 久久久在线视频| 日韩av在线网| 日韩精品中文字幕在线观看| 欧美日韩中文在线| 九九热视频这里只有精品| 色婷婷久久一区二区| 中文字幕亚洲情99在线| 日韩在线视频中文字幕| 成人日韩av在线| 久久久久在线观看| 久久99热精品这里久久精品| 97在线观看免费高清| 亚洲精品之草原avav久久| 97国产suv精品一区二区62| 一区二区三区无码高清视频| 国产精品一区二区三区成人| 久久精品国产视频| 国产精品无av码在线观看| 97在线免费观看| 成人羞羞国产免费| 亚洲精品大尺度| 亚洲欧美精品伊人久久| 欧美超级免费视 在线| 欧美丰满老妇厨房牲生活| 91精品视频网站| 国产精自产拍久久久久久| 国产精品91久久| 精品欧美国产一区二区三区| 国产精品网站入口| 日韩免费看的电影电视剧大全| 亚洲自拍偷拍在线| 91精品国产免费久久久久久| 91视频九色网站| 国产精品丝袜一区二区三区| 欧美疯狂做受xxxx高潮| 日韩一区在线视频| 亚洲日本aⅴ片在线观看香蕉| 日韩精品在线播放| 久久久久久久久久久免费| 亚洲变态欧美另类捆绑| 国产日韩中文在线| 91国偷自产一区二区三区的观看方式| 亚洲精品v欧美精品v日韩精品| 日韩欧美成人免费视频| 91国产高清在线| 亚洲免费电影一区| 亚洲黄色av网站| 日韩精品欧美激情| 国产精品久久久久福利| 国产成人亚洲精品| 91性高湖久久久久久久久_久久99| 色777狠狠综合秋免鲁丝| 欧美激情欧美激情| 亚洲午夜精品久久久久久久久久久久| 九九热这里只有精品6| 久久久国产在线视频| 91成品人片a无限观看| 色阁综合伊人av| 精品国产乱码久久久久酒店| 日韩成人网免费视频| 韩剧1988在线观看免费完整版| 久久久国产视频| 久久久久久国产免费| 狠狠躁夜夜躁人人躁婷婷91| 国产精品久久久精品| 亚洲曰本av电影| 欧美怡红院视频一区二区三区| 成人网页在线免费观看| 欧美人成在线视频| 国产精品尤物福利片在线观看| 全亚洲最色的网站在线观看| 中文字幕日韩欧美在线视频| 久久久www成人免费精品张筱雨| 成人在线激情视频| 成人女保姆的销魂服务| 欧美成人免费观看| 国产+成+人+亚洲欧洲| 久久综合网hezyo| 国产精品视频久久| 国产一区二区三区直播精品电影| 欧美在线中文字幕| 国产日韩精品综合网站| 亚洲缚视频在线观看| 国产午夜精品久久久| 欧美激情啊啊啊| 亚洲一区二区三区在线免费观看| 亚洲人av在线影院| 久久国产一区二区三区| 国产欧美精品一区二区三区介绍| 九色精品免费永久在线| 久热在线中文字幕色999舞| 日韩hd视频在线观看| 国产在线视频91| 精品国产999| 国产精品成av人在线视午夜片| 欧美乱人伦中文字幕在线| 欧美香蕉大胸在线视频观看| 在线电影av不卡网址| 欧美中文字幕视频| 日韩国产欧美精品一区二区三区| 国产亚洲视频在线| 亚洲精品电影网在线观看| 日韩大片在线观看视频| 亚洲xxxxx性| 成人写真视频福利网| 精品国产91久久久久久老师| 一本一道久久a久久精品逆3p| 亚洲国产精品一区二区久| 中文字幕精品久久| 久久久999精品|