在.filter()中如何让回调函数调用另一个函数?

时间:2017-11-25 21:45:07

标签: javascript callback

我试图抓住callback functions,但我遇到了一些我不太了解的事情。

这段代码在以下示例中使用时效果很好。

zombieCreatures = creatures.filter(filterCreatures);

不幸的是,当在同一个例子中使用时,这段代码不起作用。

zombieCreatures = creatures.filter(function(v) {
    filterCreatures(v);
});

对我来说,他们看起来像是相同的指示,但显然我不对。有什么不同?是否有可能使回调函数调用.filter()中的另一个函数?



'use strict';

var creatures = [], zombieCreatures = [];

var filterCreatures;

creatures = [
  {species: 'Zombie', hitPoints: 90},
  {species: 'Orc', hitPoints: 40},
  {species: 'Skeleton', hitPoints: 15},
  {species: 'Zombie', hitPoints: 85}
];
	
filterCreatures = function(v) {
  return v.species === 'Zombie';
}
	
zombieCreatures = creatures.filter(function(v) {
  filterCreatures(v);
});

console.log(zombieCreatures);




1 个答案:

答案 0 :(得分:4)

是的,你当然可以调用filter回调中的任何其他功能。

你唯一缺少的是回调需要返回一个值。您的回调没有return语句。它调用filterCreatures()函数,但随后它会丢弃该函数返回的值,默认情况下返回undefined

与原始版本的代码进行比较:

creatures.filter(filterCreatures);

在此代码中,filter()直接调用filterCreatures函数,然后使用其返回值来决定是否包含该元素。您没有在代码中明确地看到这一点,但filter()正在寻找该返回值。

这是一个有助于澄清这一点的练习。获取损坏的代码并将内联过滤器回调移动到命名函数。我们称之为filterCreaturesWrapper。所以不要这样:

filterCreatures = function(v) {
  return v.species === 'Zombie';
}

zombieCreatures = creatures.filter(function(v) {
  filterCreatures(v);
});

我们有这个:

filterCreatures = function(v) {
  return v.species === 'Zombie';
}

filterCreaturesWrapper = function(v) {
  filterCreatures(v);
}

zombieCreatures = creatures.filter(filterCreaturesWrapper);

如果你研究那个,你会发现它和以前完全一样,我们只是稍微移动一下。 filterCreaturesWrapper.filter()调用内联的函数相同。现在问题应该突然出现在我们面前:filterCreatures有一个return语句而filterCreaturesWrapper没有。{/ p>

回到最初破碎的代码,就好像我们写了:

zombieCreatures = creatures.filter(function(v) {
  filterCreatures(v);
  return undefined;  // .filter treats this as 'false'
});

因此,只需在回调中添加return即可:

'use strict';

var creatures = [], zombieCreatures = [];

var filterCreatures;

creatures = [
  {species: 'Zombie', hitPoints: 90},
  {species: 'Orc', hitPoints: 40},
  {species: 'Skeleton', hitPoints: 15},
  {species: 'Zombie', hitPoints: 85}
];
	
filterCreatures = function(v) {
  return v.species === 'Zombie';
}
	
zombieCreatures = creatures.filter(function(v) {
  return filterCreatures(v);  // <-- added "return"
});

console.log(zombieCreatures);

并非每种语言都是这样的。例如,Ruby是否返回方法(函数)中的最后一个表达式,无论您是否明确说出return。因此,如果您正在编写Ruby代码(假设所有其他位也转换为Ruby),那么您的代码就可以工作了!