javascript - 将 element.id 设置为副作用是不好的做法吗?

标签 javascript jquery dom

我正在插件/库中编写一个小的缓存函数。它接受一个 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];
}

在这里,我通过 HTMLElementid 将一些昂贵的操作存储在缓存中。这是一个 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];
}

最佳答案

不使用 id,而是使用 data-x - 这就是它的创建目的。

id 有一个特定的含义,看到它自动生成会让人感到困惑(即使有适当的记录,这几乎永远不会。)你也有轻微的覆盖机会。

关于javascript - 将 element.id 设置为副作用是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6272128/

相关文章:

javascript - 如何在 jquery 的 .html() 中设置文本样式

jquery - 我不应该在不使用 jquery 的页面上包含 jquery 吗?

javascript - 根据选择打印多个输入字段

javascript - 如何在iOS中绑定(bind)点击事件?

javascript - chrome中的Javascript函数使黑线出现

javascript - Chrome 不在来自 iframe 的 ajax 请求中添加 header ,Firefox ok

javascript - $.getScript 返回什么,它对范围有何作用?

php - 如何将 PHP 正则表达式转换为 JavaScript 正则表达式

javascript - 在加载事件触发后,什么样的 HTTP 请求可以挂起?

html - 我应该如何在图片网址中添加动态值?