在js中,函数可以有属性和方法,并且可以被调用。所以其特征之一就是,将函数作为第一型对象。
let obj={};
let fn=function(){};//将函数赋值给对象的一个属性,从而创建一个方法。
1.函数存储
1.我们创建一个对象,并且复制给
store
变量,该对象有两个数据属性:一个用于存储下一个可用的id
,另一个cache
用于存储函数,函数时通过add()
方法将其添加到cache中的。
> 2.在add()函数中,首先检测id是否已经存在,如果存在,则说明已经被处理过。如果不存在,我们为其分配一个id属性,并且自增。然后将函数作为cache的一个属性添加进来,同时使用id值作为属性名称。 代码:
let store={
nexId:1,
cache:{},//创建一个对象作为缓存,用于存储函数
add:function(fn){
if(!fn.id){
fn.id=store.nexId++;
return !!(store.cache[fn.id]=fn);//通过!!构造一个将任意表达式转化为其等效布尔值的简单方式。
}
}
};
function nihao(){};
store.add(nihao);
2.缓存记忆
它是构建函数的过程,这种函数能够记住之前计算的结果。例如,在列表里存储已经遍历过的DOM元素。
function getElements(name){
if(!getElements.cache) getElements.cache={};
return getElements.cache[name]=getElements.cache[name]||document.getElementsByTagName(name);
}
我们可以将状态和缓存信息存储在一个封装的独立位置上,不仅在代码组织上有好处,而且外部存储或缓存对象无需污染作用域,就可以提升其性能。
优点:
- 在函数调用获取之前计算结果的时候,最终用户享有性能优势。
- 发生在幕后,完全无缝,最终用户和页面开发人员都无需任何特殊操作或为此做任何额外的初始化工作。
缺点:
- 缓存牺牲内存。
- 很难测试一个算法的性能。
3.仿造数组方法
我们可以为任何对象添加属性和方法,包括数组。
eg 代码:
let elems={
length:0,
add:function(elem){
Array.prototype.push.call(this,elem);
},
gather:function(id){
this.add(document.getElementByID(id));
}
};