4

如果先前已选择该元素,则此代码片段将从缓存中返回一个元素,或者选择、缓存并返回该元素。它对于更新从未显着改变的元素的内容很有用(即,用户看到的计数器的父级,其中数字发生了变化,但父级没有)。代码如下:

var $$ = (function() {
    var cache = {};
    return (function (selector) {
        return cache[selector] || ( cache[selector] = jQuery (selector) );
    });
})();

你可以像这样使用它:

$$('#id')


现在......这到底是怎么回事?如何$$访问 jQuery 选择器?$$与开始无关$,你也可以这样做var foo。如何$$将传入的内容映射到selector. 我希望看到var selector = argumentName里面$$。另外,对我来说,它似乎没有$$设置为接收参数(例如, function(input){} ),但它很容易做到吗?

这段小代码让我非常困惑,非常感谢一些清晰。谢谢!

4

2 回答 2

5

这很简单。这是等效的代码,但在未打包的版本中以使其更明确:

function generateCachingJQuery() {
    var cache = {};
    function queryFunc(selector) {
        if (cache[selector]) {
            return cache[selector];
        } 
        else {
            cache[selector] = jQuery(selector); //same as $(selector)
            return cache[selector];
        }
    }
    return queryFunc;
}
var $$ = generateCachingJQuery();

如果你注意到,首先你有一个匿名函数——我generateCachingJQuery在这里命名——它返回$$最终成为的函数。这样做是为了使除了内部函数(queryFunc此处命名)之外没有任何东西可以访问该cache变量。其余的只是我在这里拆包的单线,以使其更清楚它在做什么。

编辑:要清楚,$$最终出现queryFunc在上面的代码中,而不是generateCachingJQuery. 请注意,queryFuncselector作为一个变量。

于 2013-09-01T02:21:34.520 回答
3
var $$ = (function() { // begin closure

  var cache = {}; // keep in memory through closure

  // The function that gets assigned to `$$`     
  return function(selector) {
    // If the element has already been queried (exists in the cache)
    // then return the element that was previously stored,
    // otherwise query the new element, add it to the cache and return it
    return cache[selector] || (cache[selector] = jQuery(selector));
  };
})(); // end closure
于 2013-09-01T02:25:17.400 回答