浅尝函数柯里化
定义
将一个需要传入多个参数的函数转化成,只传入一个参数的函数,并返回接收余下参数且返回结果的新函数。
应用
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