美文网首页
JavaScript性能优化

JavaScript性能优化

作者: zxhnext | 来源:发表于2020-08-09 21:58 被阅读0次

1. 如何精准测试 JavaScript 性能

● 本质上就是采集大量的执行样本进行数学统计和分析
● 使用基于 Benchmark.js 的 https://jsperf.com/ 完成

1.1 Jsperf使用流程

● 使用GitHub账号登录
● 填写个人信息(非必须)
● 填写详细的测试用例信息( title、 slug)
● 填写准备代码(DOM操作时经 常使用)
● 填写必要有setup与teardown代码
● 填写测试代码片段

2.1 慎用全局变量

● 全局变量定义在全局执行上下文,是所有作用域链的顶端(查找消耗时间)
● 全局执行上下文一直存在于上下文执行栈,直到程序退出(不利于GC)
● 如果某个局部作用域出现了同名变量则会遮蔽或污染全局

2.2 缓存全局变量

将使用中无法避免的全局变量缓存到局部
demo:

<input type="button" value="btn" id="btn1" />
<input type="button" value="btn" id="btn2" />
<input type="button" value="btn" id="btn3" />
<input type="button" value="btn" id="btn4" />
<p>1111</p>
<input type="button" value="btn" id="btn5" />
<input type="button" value="btn" id="btn6" />
<p>2222</p>
<input type="button" value="btn" id="btn7" />
<input type="button" value="btn" id="btn8" />
<input type="button" value="btn" id="btn9" />
<p>3333</p>
<input type="button" value="btn" id="btn10" />

<script>
        function getBtn() {
            let oBtn1 = document.getElementById('btn1')
            let oBtn3 = document.getElementById('btn3')
            let oBtn5 = document.getElementById('btn5')
            let oBtn7 = document.getElementById('btn7')
            let oBtn9 = document.getElementById('btn9')
        }

        function getBtn2() {
            let obj = document
            let oBtn1 = obj.getElementById('btn1')
            let oBtn3 = obj.getElementById('btn3')
            let oBtn5 = obj.getElementById('btn5')
            let oBtn7 = obj.getElementById('btn7')
            let oBtn9 = obj.getElementById('btn9')
        }
    </script>
image.png

通过原型对象添加附加方法
demo:

var fn1 = function() {
    this.foo = function() {
        console.log(1111)
    }
}
let f1 = new fn1()

var fn2 = function() {
}
fn2.prototype.foo = function() {
    console.log(1111)
}
let f2 = new fn2()
image.png

避开闭包陷阱

● 闭包是一种强大的语法
● 闭包使用不当很容易出现内存泄露
● 不要为了闭包而闭包

demo:

function test(func) {
    console.log(func())
}

function test2() {
    var name = 'lg'
    return name
}

test(function() { // 属于闭包,内部有赋值操作
    var name = 'lg'
    return name
})

test(test2)
image.png

避免属性访问方法使用

● JS不需属性的访问方法,所有属性都是外部可见的
● 使用属性访问方法只会增加一层重定义,没有访问的控制力

demo:

function Person() {
    this.name = 'lg'
    this.age = 18
    this.getAge = function() {
        return this.age
    }
}

const p1 = new Person()
const a = p1.getAge()

function Person() {
    this.name = 'lg'
    this.age = 18
}

const p2 = new Person()
const b = p2.age
image.png

for循环优化
demo:

var arrList = []
arrList[10000] = 'lg'

for (let i = 0; i < arrList.length; i++) {
    console.log(arrList[i])
}

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

选择最优的循环方法
demo:

let arrList = new Array(1, 2, 3, 4, 5)

arrList.forEach(item => {
    console.log(item)
})

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

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

for (let item of arrList) {
    console.log(item)
}
image.png

forEach比for循环快的原因:

[1,2, ,3] arr.forEach(() => {
 // 这里每次开启一个作用域
 })
for (let i = arr.length; i >= 0; i--) {
 // 开启两个作用域,这里一个,括号里一个
 }

文档碎片优化节点开发
节点的添加操作必然有回流和重绘
demo:

for (let i = 0; i < 10; i++) {
    let oP = document.createElement('p')
    oP.innerHTML = i
    document.body.appendChild(oP)
}

const fragEle = document.createDocumentFragment()
for (let i = 0; i < 10; i++) {
    let oP = document.createElement('p')
    oP.innerHTML = i
    fragEle.appendChild(oP)
}
document.body.appendChild(fragEle)
image.png

克隆优化节点操作
demo:

<p id="box1">old</p>
<script>
    for (let i = 0; i < 5; i++) {
        let oP = document.createElement('p')
        oP.innerHTML = i
        document.body.appendChild(oP)
    }

    let oldP = document.getElementById('box1')
    for (let i = 0; i < 5; i++) {
        let newP = oldP.cloneNode(false)
        newP.innerHTML = i
        document.body.appendChild(newP)
    }
</script>
image.png

直接量替换 new Object
demo:

let a = [1, 2, 3]

let a1 = new Array(1, 2, 3)
image.png

相关文章

  • 前端性能优化

    前端性能优化 下面是我认知的前端性能优化的策略,本书主要着手 JavaScript 优化展开阐述。 JavaScr...

  • JavaScript 性能优化

    介绍 性能优化是不可避免的哪些内容可以看做性能优化无处不在的前端性能优化 JavaScript内存管理 为什么要使...

  • Chrome 性能监控 性能分析

    Chrome开发者工具之JavaScript内存分析 前端性能优化 —— 前端性能分析 Chrome DevToo...

  • Javascript 性能优化

    Javascript最初是解释型语言,现在,主流浏览器内置的Javascript引擎基本上都实现了Javascri...

  • JavaScript性能优化

    1,web页面脚本阻塞:由于脚本会阻塞页面其他资源的下载,因此推荐将所有的 标签尽可能放到 标签的底部,可以尽量减...

  • Javascript 性能优化

    加载 放到body底部 数据读取 访问局部变量 比 全局要快 频繁访问对象属性,请保存到变量中 DOM操作 最小化...

  • javascript性能优化

    优化页面加载时间html标签加载顺序浏览器加载和执行script标签引入的js时,会暂停页面渲染,直到代码加载并执...

  • JavaScript性能优化

    如何精准测试JS的性能,通过https://jsbench.me/[https://jsbench.me/] 1....

  • JavaScript 性能优化

    作者:酸菜牛肉 文章内容输出来源:拉勾教育大前端高薪训练营课程 性能优化介绍 内存管理 ...

  • JavaScript性能优化

    1. 如何精准测试 JavaScript 性能 ● 本质上就是采集大量的执行样本进行数学统计和分析● 使用基于 B...

网友评论

      本文标题:JavaScript性能优化

      本文链接:https://www.haomeiwen.com/subject/jfepahtx.html