这是什么意思?这[找到'](函数(模型){...})

时间:2014-12-14 14:08:25

标签: javascript backbone.js

我试图理解Backbone Collection findWhere()函数是如何工作的,我在代码中看到了这一点:

    // Return models with matching attributes. Useful for simple cases of
    // `filter`.
    where: function(attrs, first) {
      var matches = _.matches(attrs);
      return this[first ? 'find' : 'filter'](function(model) {
        return matches(model.attributes);
      });
    },

    // Return the first model with matching attributes. Useful for simple cases
    // of `find`.
    findWhere: function(attrs) {
      return this.where(attrs, true);
    },

我试图了解这一部分的作用:

  return this[first ? 'find' : 'filter'](function(model) {
    return matches(model.attributes);
  });

这部分this['find'](function(model){ ... })实际上做了什么?

4 个答案:

答案 0 :(得分:3)

您可以在javascript中使用括号表示法而不是点符号,并且括号表示法在您拥有的情况下非常方便。所以,以下是相同的:

foo.['bar']
foo.bar()

在这一行:

return this[first ? 'find' : 'filter'](function(model) {
如果第一个值返回true,则使用

this.find(),否则将使用this.filter()

答案 1 :(得分:1)

就像这样

  • thisObject

  • [first ? 'find' : 'filter']检查bool first是否为正数,然后返回'find'其他'filter',它们是由括号表示法[]访问的函数引用。简而言之,使用三元运算符来通过bracker表示法访问函数引用。

  • (...){}是该函数的调用。

答案 2 :(得分:1)

this['find'](function(model){ ... })

这部分等于:

this.find(function(model){ ... })

所以答案是:对象find的方法this是用参数调用的(我假设它是回调:))function(model){ ... }

答案 3 :(得分:1)

return this[first ? 'find' : 'filter'](function(model) {
    return matches(model.attributes);
});

相同
var functionName = (first ? 'find' : 'filter');
return this[functionName](function(model) {
    return matches(model.attributes);
});

相同
var functionName;
if(first){
    functionName = 'find';
} else {
    functionName = 'filter';
}
return this[functionName](function(model) {
    return matches(model.attributes);
});

相同
if(first){
    return this['find'](function(model) {
        return matches(model.attributes);
    });
} else {
    return this['filter'](function(model) {
        return matches(model.attributes);
    });
}

相同
if(first){
    return this.find(function(model) {
        return matches(model.attributes);
    });
} else {
    return this.filter(function(model) {
        return matches(model.attributes);
    });
}

我希望能够清除它。