我有一个想念,是过滤器功能向下的funarg问题的一个例子?我在sources面板下使用了chrome调试器,并在范围部分注意到了这一点。
过滤器函数param cb
是闭包还是闭包函数strainer
?我发现很难对有关闭包的信息和网络上的funarg问题进行排序。我显然不了解funarg问题或关闭并需要一些帮助?
function strainer(collection, cb) {
return collection.reduce(function inner(acc, curr) {
if (cb(curr)) {
return acc.concat(curr);
}
return acc;
}, []);
}
function even(number) {
if (number % 2 === 0) {
return true;
}
return false;
}
var collection = [1, 2, 3, 4, 5];
strainer(collection, even);
背景:我的印象是私有变量返回到外部环境创建的闭包,但示例看起来像是不同的。
下面的flintstones函数示例关闭了引号函数的范围。(我认为这是向上的funarg问题)
function quotes() {
var x = 'yabba dabba doo!';
return function flintstones() {
return x;
}
}
var fredSays = quotes();
fredSays();

答案 0 :(得分:4)
过滤器函数param
cb
是闭包还是闭包函数strainer
?
实际上也没有。 inner
是关闭。您正在检查此处inner
的范围链 - 它包含本地acc
和curr
变量,以及关闭cb
变量的自由变量cb
strainer
范围。那是调试器试图向您展示的内容。 cb
范围的strainer
部分未在堆栈中分配,而是在堆中分配,但调试器不会显示该详细信息。
是的,这或多或少是downward funarg problem。 inner
传递给reduce
,这就是为什么我们为它创建一个闭包的原因。请注意,向上和向下之间的区别在JS中是没有意义的,因为我们永远不知道被调用函数对传递的回调做了什么 - 它可能会把它存放在某个地方。证明它仍然包含在呼叫中并且没有逃脱呼叫。