js性能最適化小結
17910 ワード
<!--&菗13;
.article{&噫13;
box-show:0 3 px 7 px rgba(0,0,0,0.1);
border-radius:4 px;&菵13;
background:璖f 7 ebe 6;&璖13;
font-family:“マイクロソフト雅黒”;
magin-bottom:20 px;&唳13;
}&{13;
head{&菗13;
height:38 px;
border-radius:4 px 4 px 0;
box-show:0 px 10 px-6 px rgba(0,0,0,0.1);
paddingn-left:20 px;&菵13;
カラー:(菷9393;&唗13;;;;;;;;;;;;;;;;;;;;;;;;;13;
line-height:38 px;&苋13;
font-size:16 px;
}&{13;
con{&夝13;
padding:10 px 20 px 0;
line-height:24 px;&菵13;
font-size:12 px;
カラー:(菷9393;&唗13;;;;;;;;;;;;;;;;;;;;;;;;;13;
background:菗fff;&噫13;
}&{13;
-->
グローバル検索を避ける
ブラウザがローカル変数にアクセスする速度は、グローバル変数にアクセスする速度よりも速く、変数は、スコープ内の階層を検索するのに時間がかかります.
エヴァ似の問題
jsのeval、setTimeout、set Interval、new Function()の動作はすべて文字列をjsコードとして実行することができます.この過程でコードの実行効率は非常に低く、使用を避けるべきです.匿名関数または伝達関数の参照を推奨します.
タイマー
コードを一定間隔で実行する場合、setIntervalを使用して、setTimeoutを通じて実現しないでください.一つのタイマーをオンにすると初期化されますので、setTimeoutを採用することは、常にタイマーを初期化することによって実現されます.
複数の文字列接続
複数の文字列を接続する必要がある場合は、+==を少なめに使用し、データのjolin方法を使用した方がいいです.
タイプ変換
数字を文字列に変換するには、「」+数値を使います.
文字列の回転数:1*文字列;
任意の内部変換ブール:!変数;
変数宣言は単一varを使用します.
変数宣言はすべて単一var形式を採用しており、コードの実行時間を減らすことができます.変数宣言は比較的統一されています.
自己増加自滅式を表式に入れる
オブジェクトと配列の字面量を使う
クローズド中で使用しない変数のリリース
クローズド中の変数が他の関数で使用されると、この変数はずっとメモリに残ります.また、DOMの参照は大きなメモリを消耗しますので、クローズド中のもう参照しない変数を即時にリリースするべきです.
reflowを減らす
css仕様にはレンダリング対象の概念があります.通常は箱で表します.mozelaはframeというオブジェクトを通して箱を操作します.
reflow:DOMツリーを読み込み、frame構造の応答を作成または更新するプロセス.reflowを減らす方法:
1、要素を削除し、変更が完了したら元に戻す
2、元素displayをnoneに等しくし、修正したら元に戻す.
3、複数のスタイルを変更する場合は、このスタイルの代わりにクラスで操作します.
4、大量の要素を追加してページにdocumentFragmentを使用する
イベント依頼
サブ要素のイベントは、親要素またはより高い要素に登録され、各サブノードにイベントの傍受を登録する必要はない.
DOM削除
DOMノードを削除する時、必ずDOM上のバインディングされたイベントを削除します.でないと、回収できなくなり、メモリを占有します.
DOM集合のアクセスを減らす
集合をjsで取得する場合:
1、getElements ByTagName
2、childNodes
3、atributes
4、document.forms document.imags
…
否定操作の短縮
できるだけ論理的な非を使用して条件判断を行い、nullまたはfalseに等しい使用を減らす.
.article{&噫13;
box-show:0 3 px 7 px rgba(0,0,0,0.1);
border-radius:4 px;&菵13;
background:璖f 7 ebe 6;&璖13;
font-family:“マイクロソフト雅黒”;
magin-bottom:20 px;&唳13;
}&{13;
head{&菗13;
height:38 px;
border-radius:4 px 4 px 0;
box-show:0 px 10 px-6 px rgba(0,0,0,0.1);
paddingn-left:20 px;&菵13;
カラー:(菷9393;&唗13;;;;;;;;;;;;;;;;;;;;;;;;;13;
line-height:38 px;&苋13;
font-size:16 px;
}&{13;
con{&夝13;
padding:10 px 20 px 0;
line-height:24 px;&菵13;
font-size:12 px;
カラー:(菷9393;&唗13;;;;;;;;;;;;;;;;;;;;;;;;;13;
background:菗fff;&噫13;
}&{13;
-->
グローバル検索を避ける
ブラウザがローカル変数にアクセスする速度は、グローバル変数にアクセスする速度よりも速く、変数は、スコープ内の階層を検索するのに時間がかかります.
1 //
2 function fn(){
3 document.getElementById('id1');
4 document.getElementById('id2');
5 }
6
7 //
8 function fn(){
9 var doc = document;
10 doc.getElementById('id1');
11 doc.getElementById('id2');
12 }
13 //
14 !function fn(doc){
15 doc.getElementById('id1');
16 doc.getElementById('id2');
17 }(document);
エヴァ似の問題
jsのeval、setTimeout、set Interval、new Function()の動作はすべて文字列をjsコードとして実行することができます.この過程でコードの実行効率は非常に低く、使用を避けるべきです.匿名関数または伝達関数の参照を推奨します.
1 // eval
2
3 // setTimeout、setInterval、new Function
4 setTimeout('alert(1)', 1000); //
5 setInterval('alert(1)', 1000); //
6 var oFn = new Function('alert(1)'); //
7
8 //
9 setTimeout(function(){
10 alert(1);
11 }, 1000);
12 setTimeout(fn, 1000);
13
14 setInterval(function(){
15 alert(1);
16 }, 1000);
17 //setInterval(fn, 1000);
18
19 var oFn = new Function(function(){
20 alert(1);
21 });
22 var oFn = new Function(fn);
23
24 function fn(){
25 alert(1);
26 }
タイマー
コードを一定間隔で実行する場合、setIntervalを使用して、setTimeoutを通じて実現しないでください.一つのタイマーをオンにすると初期化されますので、setTimeoutを採用することは、常にタイマーを初期化することによって実現されます.
1 var i = 0,
2 timer = null;
3
4 //
5 function fnTimeout(){
6 if(i < 10){
7 setTimeout(fnTimeout, 1000); //
8 }
9 console.log(i++);
10 }
11 fnTimeout();
12
13 //
14 function fnInterval(){
15 if(i >= 10){
16 clearInterval(timer);
17 timer = null;
18 }
19 console.log(i++);
20 }
21 setInterval(fnInterval, 1000); //
複数の文字列接続
複数の文字列を接続する必要がある場合は、+==を少なめに使用し、データのjolin方法を使用した方がいいです.
1 var a = 'a',
2 b = 'b',
3 c = 'c',
4 s = '',
5 arr = [];
6
7 //
8 s += a;
9 s += b;
10 s += c;
11
12 //
13 s = a + b + c;
14
15 //
16 arr.push(a);
17 arr.push(b);
18 arr.push(c);
19 s = arr.join('');
タイプ変換
数字を文字列に変換するには、「」+数値を使います.
文字列の回転数:1*文字列;
任意の内部変換ブール:!変数;
変数宣言は単一varを使用します.
変数宣言はすべて単一var形式を採用しており、コードの実行時間を減らすことができます.変数宣言は比較的統一されています.
1 //
2 var a = 'a';
3 var b = 'b';
4 var c = 'c';
5 var s = '';
6 var arr = [];
7
8 //
9 var a = 'a',
10 b = 'b',
11 c = 'c',
12 s = '',
13 arr = [];
自己増加自滅式を表式に入れる
1 //
2 var i = 0,
3 b = i;
4 i++;
5
6 //
7 var i = 0,
8 b = i++;
オブジェクトと配列の字面量を使う
1 //
2 var arr = new Array,
3 obj = new Object,
4 re = new RegExp('a');
5
6 //
7 var arr = [],
8 obj = {},
9 re = /a/;
クローズド中で使用しない変数のリリース
クローズド中の変数が他の関数で使用されると、この変数はずっとメモリに残ります.また、DOMの参照は大きなメモリを消耗しますので、クローズド中のもう参照しない変数を即時にリリースするべきです.
1 //
2 var fn = !function(doc){
3 var obj = {name: 'hum'},
4 arr = [1, 2],
5 oDom = doc.getElementById('id');
6
7 // ......
8
9 return function(){
10 console.log(obj.name);
11 }
12 }(document);
13
14 //
15 var fn = !function(doc){
16 var obj = {name: 'hum'},
17 arr = [1, 2],
18 oDom = doc.getElementById('id');
19
20 // ......
21
22 arr = doc = oDom = null; //
23
24 return function(){
25 console.log(obj.name);
26 }
27 }(document);
reflowを減らす
css仕様にはレンダリング対象の概念があります.通常は箱で表します.mozelaはframeというオブジェクトを通して箱を操作します.
reflow:DOMツリーを読み込み、frame構造の応答を作成または更新するプロセス.reflowを減らす方法:
1、要素を削除し、変更が完了したら元に戻す
2、元素displayをnoneに等しくし、修正したら元に戻す.
3、複数のスタイルを変更する場合は、このスタイルの代わりにクラスで操作します.
4、大量の要素を追加してページにdocumentFragmentを使用する
イベント依頼
サブ要素のイベントは、親要素またはより高い要素に登録され、各サブノードにイベントの傍受を登録する必要はない.
DOM削除
DOMノードを削除する時、必ずDOM上のバインディングされたイベントを削除します.でないと、回収できなくなり、メモリを占有します.
DOM集合のアクセスを減らす
集合をjsで取得する場合:
1、getElements ByTagName
2、childNodes
3、atributes
4、document.forms document.imags
…
否定操作の短縮
できるだけ論理的な非を使用して条件判断を行い、nullまたはfalseに等しい使用を減らす.