闭包和 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 的作用域链 - 它有局部 acccurr 变量,以及关闭 cb 变量的自由变量 cb strainer 范围。这就是调试器试图向您展示的内容。 strainer 作用域的 cb 部分未分配在堆栈上,而是分配在堆中,但是调试器不显示该详细信息。

是的,这或多或少是 downward funarg probleminner 在这里传递给 reduce ,这就是我们为它创建闭包的原因。请注意,向上和向下之间的区别在 JS 中是没有意义的,因为我们永远不知道被调用的函数对传递的回调做了什么——它还不如把它藏在某个地方。证明它包含在调用中并且没有逃脱调用还没有完成。