The*_*dow 0 javascript closures first-class-functions
我有一个错误的理解,过滤器功能是向下的 funarg 问题的一个例子吗?我在源面板下使用 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);
Run Code Online (Sandbox Code Playgroud)
背景:我的印象是私有变量返回到外部环境创建了闭包,但该示例看起来有所不同。
下面的 flintstones 函数示例在引号函数的范围内有闭包。(我认为这是向上的 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);
Run Code Online (Sandbox Code Playgroud)
过滤器函数参数
cb是闭包还是strainer闭包函数?
也没有,实际上。inner是闭包。您正在检查inner此处的作用域链- 它具有局部变量acc和curr变量,以及从作用域中cb关闭cb变量的自由变量strainer。这就是调试器试图向您展示的内容。范围的cb一部分strainer不是在堆栈上而是在堆中分配,但是调试器不会显示该详细信息。
是的,这或多或少是向下的 funarg 问题。inner传递到reduce这里,这就是我们为它创建一个闭包的原因。请注意,在 JS 中向上和向下的区别是没有意义的,因为我们永远不知道被调用的函数对传递的回调做了什么——它也可能把它藏在某个地方。没有证明它保持包含在调用中并且没有逃脱调用。
| 归档时间: |
|
| 查看次数: |
370 次 |
| 最近记录: |