4 javascript jquery design-patterns jquery-ui
在下面的JQuery UI小部件中,作者使用了extend来包含两个以上的函数$.ui.autocomplete,为什么?这是一个特定于JQuery的模式还是我可以在普通的JS中考虑的东西?
$.extend( $.ui.autocomplete, {
escapeRegex: function( value ) {
    return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
},
filter: function(array, term) {
    var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" );
    return $.grep( array, function(value) {
        return matcher.test( value.label || value.value || value );
    });
}
});
https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js#L385
Mon*_*der 10
没有理由使用它,实际上它比手动常规JS方式慢.jQuery开发人员常常遇到一个问题,他们只知道如何使用jQuery而不是常规的javascript.与自己管理事物相比,jQuery的扩展函数是一个递归实际上相当慢的野兽.
*编辑*由于人们似乎不想接受这个答案,让我说明为什么没有理由.
如果你在github上查看jQuery的代码:https://github.com/jquery/jquery/blob/master/src/core.js你会在313行找到jQuery.extend的定义.
首先,让我们看一下非jQuery扩展方式的必要性.
$.ui.autocomplete.escapeRegex = function() {}
$.ui.autocomplete.filter = function() {}
两个定义,没有函数调用.非常简单快速的代码.
这是jQuery在使用extend时所做的事情.
在315行,我们看到了一个快速的小测试来组织一些参数.接下来,我们有另一个可能代码执行的小IF语句.接下来是另一个在if内部调用函数的IF.接下来是另一个IF.然后我们为每个参数输入一个FOR循环,在我们的例子中是两轮.在每次传递中,首先检查空值,因为我们自己完成了这些功能所以在我们的情况下是不必要的.现在我们有一个FOR IN循环,由于必须查找对象映射中的每个项而不是迭代迭代器,因此本质上非常慢.现在我们最终将我们的一个函数复制到jQuery中!做另一次检查,以确保我们不进入无限循环...对于我们的情况这次我们只做一个小的IF检查.循环重复直到完成任务.
因此,这种方法比直接复制到jQuery对象本身要慢得多.对于使用API的人来说,一个常见的问题是即使功能使用可能很简单,看起来既快速又容易,但与自己做事相比,内部结构可能非常复杂和缓慢.