JavaScriptのパフォーマンスの最適化(メモリ管理におけるコードの最適化)

記事の説明:この記事は、レガオのフロントエンドトレーニングキャンプのメモと経験です。何か問題がある場合は、指摘して教えていただければ幸いです。ありがとうございます。 

1.クロージャートラップを避けます 

閉鎖特性

  • 外側には内側への参照があります
  • 「外部」スコープの「内部」スコープのデータにアクセスする
function foo(){
    var name = 'lg'
    function fn(){
        console.log(name)
    }
    return fn
}

var a = foo()
a()
  • クロージャは強力な構文です
  • クロージャを不適切に使用すると、メモリリークが発生しやすくなります。メモリリークが発生したら、気にしない場合は、継続的にリークするのを待ちます。これは、プログラム全体のパフォーマンスに影響します。
  • 閉鎖のために閉鎖しないでください
<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" charset="UTF-8" />
    <title>闭包陷阱</title> 
</head> 
<body>
    <button id="btn">
        Add
    </button>
<script type="text/javascript">
//    function foo(){ //由于闭包语法的存在,里面有些变量是无法回收的,在这种情况下,这种操作很多的时候,内存会越来越多
//        var el = document.getElementById('Btn')
//        el.onclick = function(){
//            console.log(el.id)
//        }
//    }

//    foo()

   function foo(){
       var el = document.getElementById('Btn')
       el.onclick = function(){
           console.log(el.id)
       }
       el = null//若是将DOM中button的节点删除之后,DOM中对document的引用消失了,把el置空之后,该函数对document的引用也消失了,这样的空间就会得以释放
   }

   foo()
</script> 
</body> 
</html>

 次に、属性アクセス方法の使用を避けます 

JavaScriptでのオブジェクト指向

  • JSは属性アクセスメソッドを必要とせず、すべての属性は外部から表示されます
  • 属性アクセス方法を使用すると、アクセス制御なしで再定義のレイヤーが追加されるだけです
function Person(){
    this.name = 'icoder'
    this.age = 18
    this.getAge = function(){
        return this.age
    }
}

const p1 = new Person()
const a = p1.getAge()//定义了一个成员属性的访问函数,直接调用函数访问


function Person(){
    this.name = 'icoder'
    this.age = 18
}
const p2 = new Person()
const b = p2.age//直接对属性名称进行访问

 3、Forループ最適化

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" charset="UTF-8" />
    <title>For循环优化</title> 
</head> 
<body>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
    <p class="btn">add</p>
<script type="text/javascript">
var aBtns = document.getElementsByClassName('btn')

for(var i = 0;i < aBtns.length;i++){
    console.log(i);
}

for(var i = 0,len = aBtns.length;i < aBtns.length;i++){//不需要像上面代码一样,每次都需要重新获取长度
    console.log(i)
}
</script> 
</body> 
</html>

 

 第四に、最良のサイクル方法を選択します

配列をトラバースする場合、forEachのパフォーマンスが最も高く、次にfor、最後にfor in

var arrList = new Array(1,2,3,4,5)
//三种不同的方式对同一数组进行遍历
arrList.forEach(function(item){
    console.log(item)
})

for(var i = arrList.length;i;i--){
    console.log(arrList[i])
}

for(var i in arrList){
    console.log(arrList[i])
}

//对数组进行遍历时,性能最好的forEach,其次是for,最后是for in

 

5、ドキュメントの断片化最適化ノードの追加

ノードの追加操作には必然的にリフローと再描画があり、多くのパフォーマンスが消費されます。

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" charset="UTF-8" />
    <title>优化节点添加</title> 
</head> 
<body>
    <button id="btn">
        Add
    </button>
<script type="text/javascript">
    for(var i = 0;i < 10;i++){
        var oP = document.createElement('p')
        oP.innerHTML = i
        document.body.appendChild(oP)
    }
//第二种优化的方式创建节点
    const fragEle = document.createDocumentFragment()//定义一个文档碎片的容器
    for(var i = 0;i < 10;i++){
        var oP = document.createElement('p')
        oP.innerHTML = i
        fragEle.body.appendChild(oP)
    }

    document.body.appendChild(fragEle)
</script> 
</body> 
</html>

ドキュメントフラグメントを使用してノードを作成します。これはより効率的です 

6、クローン最適化ノード操作

コードデモ:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width,initial-scale=1.0" charset="UTF-8" />
    <title>克隆优化节点操作</title> 
</head> 
<body>
    <p id="box1">old</p>
<script type="text/javascript">
    for(var i =0;i <3;i++){
        var oP = document.createElement('p')
        op.innerHTML = i
        document.body.appendChild(oP)
    }
//克隆节点
    var oldP = document.getElementById('box1')
    for(var i =0; i < 3;i++){
        var newP = oldP.cloneNode(false)// 通过节点克隆的方法
        newP.innderHTML = i;
        document.body.appendChild(newP)
    }
</script> 
</body> 
</html>

 7、オブジェクト操作を直接置き換える

オブジェクトまたは配列を定義するとき、newを使用して対応するデータを取得できますが、リテラルを直接使用することもできます。


var a = [1,2,3]

var a1 = new Array(3)
a1[0] = 1
a1[1] = 2
a1[2] = 3

おすすめ

転載: blog.csdn.net/weixin_41962912/article/details/110222101