一、camelize
vue源码中有这样一段代码:
/**
* Create a cached version of a pure function.
*/
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
}
/**
* Camelize a hyphen-delimited string.
*/
var camelizeRE = /-(\w)/g;
var camelize = cached(function (str) {
return str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; })
});
定义一个正则camelizeRE,其含义是将字符串中所有连字符 '-' 和连字符后的字母替换为连字符后的字母大写,即将连字符连接的字符串改为驼峰。
定义cached函数,该函数创建一个空对象{},赋值给cache,返回一个cachedFn函数(闭包)。在cachedFn中,将cache中键名为参数str的值赋给hit,如果hit有值,则返回,否则,将参数str转为驼峰式字符串以键值对形式存储在cache中,键名为参数str,值为str的驼峰式。
- 例如,运行camelize('search-form');camelize('search-form'):
- 运行第一个camelize('search-form'),创建一个空对象cache
- 将cache['search-form']赋值给hit,这时hit为undefined
- 运行cache[str] = fn(str)
运行str.replace(camelizeRE, function (_, c) { return c ? c.toUpperCase() : ''; }) - 此时cache['search-form'] = 'searchForm'
- 返回'searchForm'
- 运行第二个camelize('search-form')
- 将cache['search-form']赋值给hit,这时hit为'searchForm'
- 返回'searchForm'
二、缓存函数
上文说到cachedFn返回一个函数,是一个闭包,所以cache会一直在内存中,以此达到缓存的目的 。因此,上面的cached其实是一个缓存函数,缓存的内容是字符串的驼峰式,在实际应用中,我们也可以改造它,使它缓存我们需要的内容,比如缓存身份证号、商品库存、自增等。
var person = [
{name:'张三',id:'214325199602034526'},
{name:'李四',id:'214325199804125632'}
]
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
console.log(hit || (cache[str] = fn(str)))
})
}
var camelize = cached(function (str) {
console.log('开始缓存' + str)
let item = person.filter((val) => val.name === str)
return item[0].id;
});
camelize('张三')
camelize('李四')
console.log('开始取出缓存')
camelize('张三')
camelize('李四')
输出如下:
- 第一次运行camelize('张三'),hit为undefined,运行fn,即查找张三的id并返回,赋值给cache['张三'],输出张三的id;
- 第一次运行camelize('李四'),同上;
- 第二次运行camelize('张三'),输出cache['张三'],也就是缓存起来的张三的id
- 第二次运行camelize('李四'),同上。
三、纯函数
纯函数指的是输入与输出相同的函数。因此,上述缓存函数中,只需要将缓存改成字符串自身,就可以实现一个纯函数。不再赘述。
总结
本篇记录了vue源码中camelize函数的相关内容,如有错误,欢迎斧正~