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

时间:2017-06-15 18:56:03

标签: javascript closures first-class-functions

我有一个想念,是过滤器功能向下的funarg问题的一个例子?我在sources面板下使用了chrome调试器,并在范围部分注意到了这一点。

screenshot of my description

过滤器函数param 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函数示例关闭了引号函数的范围。(我认为这是向上的funarg问题)



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

var fredSays = quotes();
fredSays();




1 个答案:

答案 0 :(得分:4)

  

过滤器函数param cb是闭包还是闭包函数strainer

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

是的,这或多或少是downward funarg probleminner传递给reduce,这就是为什么我们为它创建一个闭包的原因。请注意,向上和向下之间的区别在JS中是没有意义的,因为我们永远不知道被调用函数对传递的回调做了什么 - 它可能会把它存放在某个地方。证明它仍然包含在呼叫中并且没有逃脱呼叫。