浅尝函数柯里化

本文探讨了Vue框架中利用函数柯里化提升性能的技巧。通过将HTML标签预存并转化为键值对,创建了一个高效的标签判断函数isHTMLTag,将查询时间复杂度从O(n)降低到O(1)。此外,还分析了虚拟DOM的render方法,提出缓存虚拟DOM以减少重复渲染,进一步优化性能。
摘要由CSDN通过智能技术生成

定义

将一个需要传入多个参数的函数转化成,只传入一个参数的函数,并返回接收余下参数且返回结果的新函数。

应用

1.判断元素

在Vue源码中,需要

1.模板 => AST(抽象语法树)
2.AST(抽象语法树)=> 虚拟DOM
3.虚拟DOM => DOM

其中最消耗性能的是1.模板 => AST(抽象语法树)
因为其中涉及对字符串的解析。

举例:在Vue中每个标签可以是HTML标签 ,也可以是自定义的组件,那怎么区分二者呢???

其实在源码中所有可能用到的HTML标签已经提前存好了,在对标签进行解析的时候,直接进行对比。但是标签的数量众多,那么查询标签就很耗费性能。

柯里化

<script>
        let tags = 'div,p,a,img,ul,li'.split(',');

        function makeMap(keys) {
            let set = {} //集合
            tags.forEach(key => {
                set[key] = true;//这里只循环一次
            })
            return function(tagName) {
                return !!set[tagName.toLowerCase()];//双感叹号转化成boolean值
            }
        }
        let isHTMLTag = makeMap(tags); //返回的函数

        //isHTMLTag这个函数,其实就是,makeMap函数中返回的一个布尔值
        // 在makeMap函数中,用set将标签和他们的值变成了键值对的形式,在匿名函数中,
        // 使用set查找标签,如果存在则返回标签名,
        // !!后会返回true;如果不存在,则会是undefined,!!后返回false
        // 当我们有10个标签需要判断的时候,时间复杂度便从O(n)变成了O(1)
    </script>

1.isHTMLTag这个函数,其实就是,makeMap函数中返回的一个布尔值。
2.在makeMap函数中,用set将标签和他们的值变成了键值对的形式,在匿名函数中,
3.使用set查找标签,如果存在则返回标签名,
4.!!后会返回true;如果不存在,则会是undefined,!!后返回false
5.当我们有10个标签需要判断的时候,时间复杂度便从O(n)变成了O(1)。
**如果我们不对函数进行柯里化,每一次都得循环查找。**现在只用循环一次。

2.虚拟DOM的render方法

思考:vue项目模板转化为抽象语法树需要执行几次?
1.页面一开始加载需要渲染。
2.每一个属性(响应式)数据在发生变化的时候要渲染。
3.watch、computed等等

render的作用是将虚拟DOM转换为真正的DOM加到页面中。

虚拟DOM可以降级理解为AST
一个项目在运行的时候,模板是不会变的,就表示AST是不会变的

优化:将虚拟DOM缓存起来,生成一个函数,函数只需传入数据,就可以得到真正的DOM

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值