0

我有一个错误的理解,过滤器功能是向下功能问题的一个例子吗?我在源面板下使用 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);

背景:我的印象是返回到外部环境的私有变量创建了闭包,但示例看起来有些不同。

下面的燧石函数示例在引号函数的范围内具有封闭性。(我认为这是向上的 funarg 问题)

function quotes() {
  var x = 'yabba dabba doo!';
  return function flintstones() {
    return x;
  }
}

var fredSays = quotes();
fredSays();

4

1 回答 1

5

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

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

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

于 2017-06-15T19:29:38.267 回答