闭包和 funarg 问题之间的区别?

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)

Ber*_*rgi 5

过滤器函数参数cb是闭包还是strainer闭包函数?

也没有,实际上。inner是闭包。您正在检查inner此处的作用域链- 它具有局部变量acccurr变量,以及从作用域中cb关闭cb变量的自由变量strainer。这就是调试器试图向您展示的内容。范围的cb一部分strainer不是在堆栈上而是在堆中分配,但是调试器不会显示该详细信息。

是的,这或多或少是向下的 funarg 问题inner传递到reduce这里,这就是我们为它创建一个闭包的原因。请注意,在 JS 中向上和向下的区别是没有意义的,因为我们永远不知道被调用的函数对传递的回调做了什么——它也可能把它藏在某个地方。没有证明它保持包含在调用中并且没有逃脱调用。