为什么在javascript中“reduce”和“map”考虑闭包?

时间:2017-07-21 20:30:58

标签: javascript closures

我正在讨论闭包,通常我将闭包看作是从另一个函数返回的函数,或者是在另一个函数内部设置为全局的函数,以便新函数(返回函数或全局变量) )引用了创建它的初始封闭函数内的变量。最近,有人告诉我,map或reduce函数形式关闭。这些返回一个或多个值,没有任何功能。当你所拥有的只是一个回调时,我不知道这个方法如何形成一个闭包。事实上,MDN声明reduce函数返回一个“value”,map函数返回一个数组。关闭在哪里?有人可以解释一下吗?

3 个答案:

答案 0 :(得分:3)

如果局部变量存在于周围的函数中并且它们在闭包内使用,则函数内定义的函数最终会成为闭包。

例如:

function boil(ocean) {
  var boiling = 100.0;

  return ocean.map(function(h2o) {
    return h2o.temp >= boiling ? 'vapour' : 'water';
  });
}

此处的boiling变量在main函数中定义,并在传递给map的函数中使用。回调函数使闭包行为更加明显,因为它们在不同的上下文中使用,但同样的原则适用。

答案 1 :(得分:1)

“闭包”是回调函数。根据MDN:

A closure is the combination of a function and the lexical environment within which that function was declared.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures

所以当你写这样的东西时:

array.map(function(object) {
    // do something
});

您传入的函数将成为一个闭包,因为它可以访问调用array.map时存在的作用域。这就是JavaScript的工作方式。

答案 2 :(得分:0)

感谢大家对此问题的回答。有了这些和chrome调试器,我得出了结论。正如Alnitak所说,“
如果它从该外部范围访问变量,它就是一个闭包。只是有能力访问它们是不够的。“这是我遗漏的一个重点。另外,你可以在chrome调试器变量包括的闭包中看到sources选项卡的范围部分。所以,看下面的例子我们可以确切地看到闭包是什么:

routerAction: function () {
  var name = "alex"; 
  var alex = function(v){
    debugger;
    console.log("this is var ", name);
  }
    alex(); // if name was passed and then printed it would be local 
            // not a closure  
}

函数从全局,局部和闭包变量中获取其范围。 当您将“name”作为参数传递给alex函数时,它将成为局部变量,因此没有闭包。因此,如果我将其传递给alex并且控制台记录了名称为“v”的控件,则不会通过闭包引用任何变量。但是,由于name在函数alex的范围之外定义,然后在其中使用,因此它通过闭包作用(这可以在chrome调试器的scope部分中看到)。通过相同的逻辑,如果您正在操作的数组(使用map或reduce)是在函数内部定义的,则回调必须形成一个闭包,如果该数组在回调内引用的话。如果参数只是通过参数引入,则没有变量通过闭包访问,它们都是局部变量。