Javascript 解释Typeahead.js substringMatcher函数

Javascript 解释Typeahead.js substringMatcher函数,javascript,typeahead.js,Javascript,Typeahead.js,我正在研究Typeahead.js,它是一个非常酷的库。由于文档非常好,我成功地获得了一个基本的示例 然而,我试图弄清楚下面这段代码实际上在做什么 var substringMatcher = function(strs) { return function findMatches(q, cb) { var matches, substringRegex; // an array that will be populated with substring matches

我正在研究
Typeahead.js
,它是一个非常酷的库。由于文档非常好,我成功地获得了一个基本的示例

然而,我试图弄清楚下面这段代码实际上在做什么

var substringMatcher = function(strs) {
  return function findMatches(q, cb) {
    var matches, substringRegex;

    // an array that will be populated with substring matches
    matches = [];

    // regex used to determine if a string contains the substring `q`
    substrRegex = new RegExp(q, 'i');

    // iterate through the pool of strings and for any string that
    // contains the substring `q`, add it to the `matches` array
    $.each(strs, function(i, str) {
      if (substrRegex.test(str)) {
        matches.push(str);
      }
    });

    cb(matches);
  };
};

在本例中,它是在初始化typeahead作为
选项时传入的。我可以理解,它从文本框中获取输入并将其与数据集进行比较,但我有点困惑
q
cb
是什么?

q
是要搜索的值。这被传递到正则表达式匹配器,搜索不区分大小写(“i”参数)

cb
是一个回调函数,返回从搜索中找到的匹配项


findMatches
基本上是一个匿名函数,用作
substringMatcher
函数的实现。

好的,这很有意义,在本例中,作者使用匿名函数有什么原因吗?看起来这有点像一种咖喱,其中strs是闭包中的字符串列表。基本上是一个方便的方式过滤STR的库克很感谢你的帮助,使事情更清楚!我讨厌不理解每一行都在做什么。问题在于,如果传入对象(strs)在typeahead对象初始化后发生更改,那么这些更改对substringMatcher不可见,因为它是在初始化过程中复制的。有人知道如何重新初始化typeahead对象吗?我通过在findMatches函数中使用全局对象的名称来解决这个问题,但是如果您有多个typeahead输入字段,那么您需要为每个字段使用一个自定义的子字符串匹配器。