DR0*_*01D 3 javascript callback
我正在尝试掌握窍门,callback functions但遇到了一些我不完全理解的问题。
这段代码在下面的示例中使用时效果很好。
zombieCreatures = creatures.filter(filterCreatures);
Run Code Online (Sandbox Code Playgroud)
不幸的是,当在同一示例中使用此代码块时,它不起作用。
zombieCreatures = creatures.filter(function(v) {
filterCreatures(v);
});
Run Code Online (Sandbox Code Playgroud)
对我来说,它们看起来像相同的说明,但显然我是不正确的。有什么不同?是否可以使回调函数调用 内部的另一个函数.filter()?
zombieCreatures = creatures.filter(filterCreatures);
Run Code Online (Sandbox Code Playgroud)
是的,您当然可以在filter回调中调用任何其他函数。
您唯一缺少的是回调需要返回一个值。您的回调没有return声明。它调用该filterCreatures()函数,但随后它会丢弃该函数返回的值并默认返回undefined.
与您的代码的原始版本进行比较:
creatures.filter(filterCreatures);
Run Code Online (Sandbox Code Playgroud)
在这段代码中,直接filter()调用该filterCreatures函数,然后使用其返回值来决定是否包含该元素。您没有在代码中明确看到这一点,但filter()正在寻找该返回值。
这是一个有助于澄清这一点的练习。取出损坏的代码并将内联过滤器回调移到命名函数中。我们会称之为filterCreaturesWrapper。所以而不是这个:
filterCreatures = function(v) {
return v.species === 'Zombie';
}
zombieCreatures = creatures.filter(function(v) {
filterCreatures(v);
});
Run Code Online (Sandbox Code Playgroud)
我们有这个:
filterCreatures = function(v) {
return v.species === 'Zombie';
}
filterCreaturesWrapper = function(v) {
filterCreatures(v);
}
zombieCreatures = creatures.filter(filterCreaturesWrapper);
Run Code Online (Sandbox Code Playgroud)
如果你研究它,你会发现它和以前的代码完全一样,我们只是稍微移动了它。filterCreaturesWrapper是在.filter()调用中内联的同一个函数。现在问题应该出现在我们身上:filterCreatures有一个return声明,filterCreaturesWrapper但没有。
回到最初的破损代码,就好像我们写过:
zombieCreatures = creatures.filter(function(v) {
filterCreatures(v);
return undefined; // .filter treats this as 'false'
});
Run Code Online (Sandbox Code Playgroud)
所以只需return在你的回调中添加一个,它就可以工作:
creatures.filter(filterCreatures);
Run Code Online (Sandbox Code Playgroud)
并非每种语言都这样工作。例如,无论您是否明确说明,Ruby 都会返回方法(函数)中的最后一个表达式return。因此,如果您正在编写 Ruby 代码(假设所有其他位也都转换为 Ruby),那么您的代码就可以工作了!