• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    JavaScript性能陷阱小結(附實例說明)_javascript技巧

    來源:懂視網 責編:小采 時間:2020-11-27 20:56:35
    文檔

    JavaScript性能陷阱小結(附實例說明)_javascript技巧

    JavaScript性能陷阱小結(附實例說明)_javascript技巧:1.避免使用eval或者Function構造函數 2.避免使用with 3.不要在性能要求關鍵的函數中使用try-catch-finally 4.避免使用全局變量 5.避免在性能要求關鍵的函數中使用for-in 6.使用字符串累加計算風格 7.原操作會比函數調用快 8.設置setTimeout(
    推薦度:
    導讀JavaScript性能陷阱小結(附實例說明)_javascript技巧:1.避免使用eval或者Function構造函數 2.避免使用with 3.不要在性能要求關鍵的函數中使用try-catch-finally 4.避免使用全局變量 5.避免在性能要求關鍵的函數中使用for-in 6.使用字符串累加計算風格 7.原操作會比函數調用快 8.設置setTimeout(

    1.避免使用eval或者Function構造函數
    2.避免使用with
    3.不要在性能要求關鍵的函數中使用try-catch-finally
    4.避免使用全局變量
    5.避免在性能要求關鍵的函數中使用for-in
    6.使用字符串累加計算風格
    7.原操作會比函數調用快
    8.設置setTimeout() 和 setInterval() 時傳遞函數名而不是字符串
    9.避免在對象中使用不需要的DOM引用
    10.最清晰的目標速度,最小化作用域鏈
    11.試著在腳本中少使用注釋,避免使用長變量名
    12.在當前作用域存儲應用的外部變量
    13.使用變量緩存值

    1.避免使用eval或者Function構造函數
    使用eval或者Function構造函數的代價是非常昂貴的,每次都需要腳本引擎轉換源代碼到可執行代碼。
    此外,使用eval處理字符串必須在運行時解釋。

    運行緩慢的代碼:
    代碼如下:
    function addMethod(object, property, code) {
    object[property] = new Function(code);
    }
    addMethod(myObj, 'methodName', 'this.localVar=foo');

    運行更快的代碼:
    代碼如下:
    function addMethod(object, property, func) {
    object[property] = func;
    }
    addMethod(myObj, 'methodName', function () { 'this.localVar=foo'; });

    2.避免使用with
    盡管很方便,with需要附加的查找引用時間,因為它在編譯的時候并不知道作用域的上下沒。

    運行緩慢的代碼:
    代碼如下:
    with (test.object) {
    foo = 'Value of foo property of object';
    bar = 'Value of bar property of object';
    }

    運行更快的代碼:
    代碼如下:
    var myObj = test.object;
    myObj.foo = 'Value of foo property of object';
    myObj.bar = 'Value of bar property of object';

    3.不要在性能要求關鍵的函數中使用try-catch-finally
    try-catch-finally在運行時每次都會在當前作用域創建一個新的變量,用于分配語句執行的異常。
    異常處理應該在腳本的高層完成,在異常不是很頻繁發生的地方,比如一個循環體的外面。
    如果可能,盡量完全避免使用try-catch-finally。

    運行緩慢的代碼:
    代碼如下:
    var object = ['foo', 'bar'], i;
    for (i = 0; i < object.length; i++) {
    try {
    // do something that throws an exception
    } catch (e) {
    // handle exception
    }
    }

    運行更快的代碼:
    代碼如下:
    var object = ['foo', 'bar'], i;
    try {
    for (i = 0; i < object.length; i++) {
    // do something
    }
    } catch (e) {
    // handle exception
    }

    4.避免使用全局變量
    如果你在一個函數或者其它作用域中使用全局變量,腳本引擎需要遍歷整個作用域去查找他們。
    全局作用域中的變量在腳本的生命周期里都存在,然后局部范圍的會在局部范圍失去的時候被銷毀。

    運行緩慢的代碼:
    代碼如下:
    var i,
    str = '';
    function globalScope() {
    for (i=0; i < 100; i++) {
    str += i; // here we reference i and str in global scope which is slow
    }
    }
    globalScope();

    運行更快的代碼:
    代碼如下:
    function localScope() {
    var i,
    str = '';
    for (i=0; i < 100; i++) {
    str += i; // i and str in local scope which is faster
    }
    }
    localScope();

    5.避免在性能要求關鍵的函數中使用for-in
    for-in循環需要腳本引擎建立一張所有可枚舉屬性的列表,并檢查是否與先前的重復。
    如果你的for循環作用域中的代碼沒有修改數組,可以預先計算好數組的長度用于在for循環中迭代數組。

    運行緩慢的代碼:
    代碼如下:
    var sum = 0;
    for (var i in arr) {
    sum += arr[i];
    }

    運行更快的代碼:
    代碼如下:
    var sum = 0;
    for (var i = 0, len = arr.length; i < len; i++) {
    sum += arr[i];
    }

    6.使用字符串累加計算風格
    使用+運算會在內存中創建一個新的字符串并把連接的值賦給它。僅僅是將這個結果賦值給一個變量。
    為了避免連接結果的中間變量,可以使用+=來直接賦值結果。

    運行緩慢的代碼:
    代碼如下:
    a += 'x' + 'y';

    運行更快的代碼:
    代碼如下:
    a += 'x'; a += 'y';

    7.原操作會比函數調用快
    可以考慮在性能要求關鍵的循環和函數中使用可以替代的原操作。
    運行緩慢的代碼:
    代碼如下:
    var min = Math.min(a, b);
    arr.push(val);

    運行更快的代碼:
    代碼如下:
    var min = a < b ? a : b;
    arr[arr.length] = val;

    8.設置setTimeout() 和 setInterval() 時傳遞函數名而不是字符串
    如果你傳遞一個字符串到setTimeout() 或者 setInterval()中,字符串將會被eval計算而導致緩慢。
    使用一個匿名函數包裝來代替,這樣在編譯的時候就可以被解釋和優化。

    運行緩慢的代碼:
    setInterval('doSomethingPeriodically()', 1000);
    setTimeOut('doSomethingAfterFiveSeconds()', 5000);

    運行更快的代碼:
    代碼如下:
    setInterval(doSomethingPeriodically, 1000);
    setTimeOut(doSomethingAfterFiveSeconds, 5000);

    9.避免在對象中使用不需要的DOM引用

    不要這么做:

    代碼如下:
    var car = new Object();
    car.color = "red";
    car.type = "sedan"

    更好的一種形式:

    代碼如下:
    var car = {
    color : "red";
    type : "sedan"
    }

    10.最清晰的目標速度,最小化作用域鏈

    低效率方法:
    代碼如下:
    var url = location.href;

    一種高效形式:
    代碼如下:
    var url = window.location.href;

    11.試著在腳本中少使用注釋,避免使用長變量名
    盡可能的保證注釋少或者避免使用注釋,特別是在函數,循環以及數組中。
    注釋不必要的減緩腳本執行并且增加了文件大小。比如:

    不建議的形式:

    代碼如下:
    function someFunction()
    {
    var person_full_name="somename"; /* stores the full name*/
    }

    更好的寫法:
    代碼如下:
    function someFunction()
    {
    var name="somename";
    }

    12.在當前作用域存儲應用的外部變量
    當一個函數被執行的運行上下問被穿件,一個活動的對象會包含所有局部變量會被推到上下文鏈的前面。
    在作用域鏈中,最慢的是清楚的識別標識符,意味著局部變量是最快的。存儲頻繁使用的外部變量讀和寫都會明顯的加快。這對于全局變量和其他深層次的標識符查找特別明顯。
    同樣,在當前作用域中的變量(var myVar)比對象像屬性的訪問速度快(this.myVar)。

    運行緩慢的代碼:

    代碼如下:
    function doSomething(text) {
    var divs = document.getElementsByTagName('div'),
    text = ['foo', /* ... n ... */, 'bar'];
    for (var i = 0, l = divs.length; i < l; i++) {
    divs[i].innerHTML = text[i];
    }
    }

    運行更快的代碼:

    代碼如下:
    function doSomethingFaster(text) {
    var doc = document,
    divs = doc.getElementsByTagName('div'),
    text = ['foo', /* ... n ... */, 'bar'];
    for (var i = 0, l = divs.length; i < l; i++) {
    divs[i].innerHTML = text[i];
    }
    }

    如果你需要訪問一個元素(如 head)在一個大的循環中,使用一個本地的DOM訪問(如例子中的get)會更快。
    運行更快的代碼:
    代碼如下:
    function doSomethingElseFaster() {
    var get = document.getElementsByTagName;
    for (var i = 0, i < 100000; i++) {
    get('head');
    }
    }

    13.使用變量緩存值
    在做重復工作的地方使用局部變量緩存值。
    下面的一組例子表明了存儲值到局部變量的廣泛意義。

    例子1.計算執行前在循環體內使用變量存儲數學函數
    錯誤的方法:
    代碼如下:
    var d=35;
    for (var i=0; i<1000; i++) {
    y += Math.sin(d)*10;
    }

    更好的處理:
    代碼如下:
    var d = 55;
    var math_sind = Math.sin(d)*10;
    for (var i=0; i<1000; i++) {
    y += math_sind;
    }

    例子2.保存數組的長度在循環中使用
    糟糕的處理:
    數組的長度每次都會被重復計算
    代碼如下:
    for (var i = 0; i < arr.length; i++) {
    // do something
    }

    更好的改進:
    更好的方法是保存數組的長度
    代碼如下:
    for (var i = 0, len = arr.length; i < len; i++) {
    // do something
    }

    總的來說,如果已經做了一次,我們就不需要重復的做不必要的工作。例如,作用域或者函數中多次使用到計算的一個表達式的值,保存到變量可以使它多次被使用,否則我們會過頭的聲明一個變量并賦值然后只適用一次。所以請記住這些。

    補充說明:
    第2點
    順便說一下JS主要不是編譯的是解釋的. 雖說不影響表達,但學術還是嚴謹點好.

    第6點這是不是格式搞亂了?
    a += ‘x' + ‘y';
    運行更快的代碼:

    a += 'x'; a += 'y';

    9.避免在對象中使用不需要的DOM引用
    new Object也是DOM引用?
    這個應該是說不要輕意使用new Object()還有new Array(), 以及new Function() 一般情況使用 {...}, [...], f = function(..){...} 即:
    這和上面那一點應該說的是一回事.

    最后補充一個少用 位運算, 因為js的所有數值運算最后(到JS引擎這層)都是全部轉得浮點來算的..所以位運算可能反而更慢.

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    JavaScript性能陷阱小結(附實例說明)_javascript技巧

    JavaScript性能陷阱小結(附實例說明)_javascript技巧:1.避免使用eval或者Function構造函數 2.避免使用with 3.不要在性能要求關鍵的函數中使用try-catch-finally 4.避免使用全局變量 5.避免在性能要求關鍵的函數中使用for-in 6.使用字符串累加計算風格 7.原操作會比函數調用快 8.設置setTimeout(
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久精品国产免费| 精品乱子伦一区二区三区高清免费播放| 欧美精品香蕉在线观看网| 精品一区二区久久| 777欧美午夜精品影院| 99精品人妻少妇一区二区| 亚洲精品国产成人专区| 精品久久久无码中文字幕| 97精品国产自在现线免费观看| 国产高清在线精品一本大道| 久夜色精品国产一区二区三区| 免费人欧美日韩在线精品| 青草国产精品久久久久久| 亚洲AV成人精品网站在线播放| 久久久久成人精品无码中文字幕 | 精品性影院一区二区三区内射| 久久久精品人妻无码专区不卡 | 国产精品秘入口福利姬网站| 亚洲国产精品第一区二区| 国产99精品久久| 国产精品美女网站| 亚洲精品无码不卡在线播放HE| 久热精品人妻视频| 亚洲精品无码专区久久久| 久久精品视频网| 亚洲精品乱码久久久久久按摩| 色花堂国产精品第一页| 午夜精品久久久久9999高清| 国产精品分类视频分类一区| 久久这里有精品视频| 99久久精品毛片免费播放| 日韩精品欧美亚洲| 成人午夜精品视频在线观看| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 久久国产精品免费一区二区三区| 久久久久久国产精品无码超碰| 国产线视频精品免费观看视频| 国产成人精品视频播放| 亚洲av无码国产精品色午夜字幕| 国产福利精品视频自拍 | 国产午夜精品无码|