我试图抓住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);

答案 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),那么您的代码就可以工作了!