0
点赞
收藏
分享

微信扫一扫

前端js代码优化

深夜瞎琢磨 2022-02-21 阅读 93

jsbench

优化方式

慎用全局变量

  • 全局变量位于全局作用域,在局部作用域中需要逐层向上查找
  • 全局变量在全局执行上下文中,会一直存在于作用域栈,直到程序结束才能被GC算法回收
  • 局部执行上下文中出现同名变量,则会污染全局变量
    jsbench中比较两段代码

缓存全局变量

在原型对象上添加附加方法

避开闭包陷阱

<body>
    <button id="btn" class="btn">click</button>
    <script>
        function click(){
            let btn = document.getElementById("btn")
            btn.onclick = function(){
                console.log(btn)
            }
        }
        click()
    </script>
</body>

修改为:

<body>
    <button id="btn" class="btn">click</button>
    <script>
        function click(){
            let btn = document.getElementById("btn")
            btn.onclick = function(){
                console.log(btn)
               
            }
             btn = null
        }
        click()
    </script>
</body>

for循环优化

几种循环的时间花销比较

文档碎片优化节点添加

 //before
        for(let i = 0;i<5;++i){
            let span = document.createElement("span")
            span.innerHTML = i
            document.body.appendChild(span)
        }
        //after
        let fag = document.createDocumentFragment()
        for(let i = 0;i<5;++i){
            let span = document.createElement("span")
            span.innerHTML = i;
            fag.appendChild(span)
        }
        document.body.appendChild(fag)

克隆优化节点

 <span id="sp">sx</span>
    <script>
        //before
        for(let i = 0;i<5;++i){
            let span = document.createElement("span")
            span.innerHTML = i
            document.body.appendChild(span)
        }
        //after
        let sp = document.getElementById("sp")
        console.log(sp)
        for (let index = 0; index < 5; index++) {
            let span = sp.cloneNode(false) 
            span.innerHTML = index
            document.body.appendChild(span)         
        }
    </script>

直接量替换new object操作

//before 
let arr = new Array()
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;

//after

let arr = [1,2,3]

减少层级判断

//判断是否是18岁的小明
//before

function judgeMing(name,age){
    if(name==='小明'){
        if(age === 18){
            console.log('正确')
        }
        else {
            console.log('错误')
        }
    }
    else {
        console.log('错误')
    }
}

//after

function judgeMing(name,age){
    if(name!=="小明"|| age!==18)
        console.log('错误')
    else {
        console.log('正确')
    }
}

减少作用域链查找层级

//before

let name = 'sx'
function foo(){
    let getName = ()=>{
        console.log(name)
    }
}

//after

let name = 'sx'
function foo(){
    let name = 'sx2'
    let getName = ()=>{
        console.log(name)
    }
}

采用事件绑定

 <ul>
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>

    </ul>
    <script>
        function show(){
            console.log('sx')
        }
        //before 
        let item = document.getElementsByTagName("li")
        for(let i of item){
            i.onclick = show
        }

        //after
        let ul = document.getElementsByTagName("ul")
        ul[0].addEventListener('click',show,true)
    </script>
举报

相关推荐

0 条评论