【问题标题】:What is jQuery $.fly plugin used for?jQuery $.fly 插件是做什么用的?
【发布时间】:2011-06-01 08:59:14
【问题描述】:

我偶然发现了jQuery.fly() - flyweight pattern 性能基准,在查看了测试代码和the plugin code itself (also see below) 之后,我不知道它有什么用?我搜索了互联网,找不到任何关于插件本身的有用信息。

与在.each 中使用$(this) 相比,它是一种更有效的循环/迭代数组的方法吗?

  • 使用 jQuery 对象进行迭代

    a.each(function() {
        $(this);
    });
    
  • 使用 jQuery.fly() 进行迭代

    a.each(function() {
        $.fly(this);
    });
    
  • 在 Firefox 4.0.1 中几乎 快 2 倍
  • 在 Chrome 12 中几乎 快 3 倍

.飞

(function($) {

    var fly  = $(),
        push = Array.prototype.push;

    $.fly = function(elem) {
        var len = fly.length,
            i;
        if ($.isArray(elem)) {
            fly.length  = 0;
            i           = push.apply(fly, elem);
        } else {
            if (elem instanceof $) {
                return elem;
            }
            if (typeof elem == "string") {
                throw "use jQuery()";
            }
            fly[0]     = elem;
            fly.length = i = 1;
        }
        // remove orphaned references
        while (i<len) {
            delete fly[i++];
        }

        return fly;
    };

})(jQuery);

【问题讨论】:

标签: javascript jquery performance jquery-plugins


【解决方案1】:

免责声明:您会得到一个全局 fly 的实例,每次调用 $.fly 时都会更改状态。如果将其存储在变量中,它将中断。这是一种微优化,除非经过适当的基准测试,否则不应使用。

优化: 任何可以证明使用 $.fly 的情况,因为使用 $ 是一个瓶颈,那么正确的解决方案是不使用 jQuery 并在 "vanilla JavaScript 中进行 DOM 操作"

这个想法是调用jQuery 是昂贵的。为避免这种情况,您调用一次$(),然后将 DOM 节点注入其中。

这基本上有一个 jQuery 的全局实例,并交换了其中的 DOM 节点。

Flyweight Pattern

享元是一种通过与其他类似对象共享尽可能多的数据来最小化内存使用的对象

这是通过只有一个 jQuery 对象来实现的。

    var len = fly.length,
        i;
    // if elem is array push all dom nodes into fly.
    if ($.isArray(elem)) {
        // empties fly
        fly.length  = 0;
        i           = push.apply(fly, elem);
    } else {
        // if already $ then return it
        if (elem instanceof $) {
            return elem;
        }
        // dont use selectors
        if (typeof elem == "string") {
            throw "use jQuery()";
        }
        // set dom node.
        fly[0]     = elem;
        fly.length = i = 1;
    }
    // remove any elements further in the array. 
    while (i<len) {
        delete fly[i++];
    }

    return fly;

进一步免责声明: 此代码未设置this.contextthis.selector,因此任何使用该代码的代码或任何可以通过使用这些代码进行优化的内部 jQuery 代码都不会被优化。

您需要彻底的基准测试和仔细的测试才能得出结论,不设置这些是值得优化的,并且共享一个 jQuery 对象不会在您的代码中导致细微的错误/副作用。

【讨论】:

  • 当现有节点每次都被丢弃时,我不确定它的可重用性。
  • @TomalakGeret'kal 不保留对fly 对象的引用。会断的!我会在顶部放一个免责声明,使用它是愚蠢的
  • 好的。 +1 来自我!尽管如此,当这个功能如此相似时,仅仅构造一个$ 是非常慢的,这是。
  • 不错的答案!简单地调用jQuery() 会产生如此巨大的开销似乎很奇怪,所以简单地缓存jQuery 就可以消除这种开销,那么您还需要注意删除“最后一项”吗?将这种优化合并到 jQuery 核心中会有什么影响吗?
  • @GaryGreen 它不会产生巨大的开销。我们说的是相对速度提高了 4 倍。这意味着 jQuery 便宜,缓存 jQuery 便宜 4 倍。问题是您需要确切地知道您在做什么,因为这不会设置selector 或其他任何有用的东西。到处使用它会导致很多错误。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多