我正在插件/库中编写一个小缓存函数.它需要一个HTMLElement并返回一个Decorator.
return function _cache(elem) {
if (elem.id === "") {
elem.id = PLUGIN_NAME + "_" + uid++;
}
if (cache[elem.id] === void 0) {
cache[elem.id] = _factory(elem);
}
return cache[elem.id];
}
这里我通过HTMLElement的id在缓存中存储一些昂贵的操作.这是一个O(1)查找,但它使用设置elem.id并产生副作用的“不良做法”.
替代方案是在缓存上进行O(N)查找
return function _cache(elem) {
for (var i = 0,ii = cache.length; i++) {
var o = cache[i];
if (o.elem == elem) return o.data;
}
var ret = _factory(elem);
cache.push({ elem: elem,data: ret });
return ret;
}
但这意味着我的缓存昂贵的方法对HTMLElement没有任何副作用.
题:
这种“副作用”是无辜的,是否值得为我的装饰师进行优化?
真实代码:
Gist of plugin template where I use this snippet
编辑:
我显然太累了,忘了data-foo存在.这是应该如何实现的
var attr = "data-" + PLUGIN_NAME + "-cache";
return function _cache(elem) {
var val = elem.getAttribute(attr);
if (val === null || val === "") {
val = PLUGIN_NAME + "_" + uid++;
elem.setAttribute(attr,val);
}
if (cache[val] === undefined) {
cache[val] = _factory(elem);
}
return cache[val];
}
最佳答案
原文链接:https://www.f2er.com/jquery/428543.html