闭包和 funarg 问题之间的区别?
Difference between a closure and the funarg problen?
我有一个误会,过滤器函数是向下函数问题的一个例子吗?我在源代码面板下使用 chrome 调试器,并在范围部分注意到了这一点。
过滤器函数参数 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 函数示例在 quotes 函数的范围内有闭包。(我认为这是向上函数参数问题)
function quotes() {
var x = 'yabba dabba doo!';
return function flintstones() {
return x;
}
}
var fredSays = quotes();
fredSays();
Is the strainer function param cb
a closure or is the function strainer
the closure?
实际上都没有。 inner
是闭包。您正在检查 inner
的作用域链 - 它有局部 acc
和 curr
变量,以及关闭 cb
变量的自由变量 cb
strainer
范围。这就是调试器试图向您展示的内容。 strainer
作用域的 cb
部分未分配在堆栈上,而是分配在堆中,但是调试器不显示该详细信息。
是的,这或多或少是 downward funarg problem。 inner
在这里传递给 reduce
,这就是我们为它创建闭包的原因。请注意,向上和向下之间的区别在 JS 中是没有意义的,因为我们永远不知道被调用的函数对传递的回调做了什么——它还不如把它藏在某个地方。证明它包含在调用中并且没有逃脱调用还没有完成。
我有一个误会,过滤器函数是向下函数问题的一个例子吗?我在源代码面板下使用 chrome 调试器,并在范围部分注意到了这一点。
过滤器函数参数 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 函数示例在 quotes 函数的范围内有闭包。(我认为这是向上函数参数问题)
function quotes() {
var x = 'yabba dabba doo!';
return function flintstones() {
return x;
}
}
var fredSays = quotes();
fredSays();
Is the strainer function param
cb
a closure or is the functionstrainer
the closure?
实际上都没有。 inner
是闭包。您正在检查 inner
的作用域链 - 它有局部 acc
和 curr
变量,以及关闭 cb
变量的自由变量 cb
strainer
范围。这就是调试器试图向您展示的内容。 strainer
作用域的 cb
部分未分配在堆栈上,而是分配在堆中,但是调试器不显示该详细信息。
是的,这或多或少是 downward funarg problem。 inner
在这里传递给 reduce
,这就是我们为它创建闭包的原因。请注意,向上和向下之间的区别在 JS 中是没有意义的,因为我们永远不知道被调用的函数对传递的回调做了什么——它还不如把它藏在某个地方。证明它包含在调用中并且没有逃脱调用还没有完成。