javascript中闭包的特定现实生活应用

时间:2017-03-25 11:32:10

标签: javascript closures

我已经使用JS两年了,我的复数访问率让我精通JS,我理解原型继承,高阶函数,IIFE等等我已经在现实世界中使用它们但是闭包是你的概念之一理解,但找不到任何理由为什么你想在现实世界的发展中使用它们,我的意思是我知道,如果我说,

function expClosure(val){
   //do something to val-->anotherVal
   return function(val){return anotherVal)};
}
var exp = expClosure(val);
exp(); --> returns the value of anotherVal;

我的问题是我为什么要这样做,或者更具体的例子可以让我考虑使用它。

3 个答案:

答案 0 :(得分:2)

我在实际单身汉thesis(2.2.2)

中写了一些关于此的内容

隐藏变量是闭包的一个有价值的用法。与其他语言相比,变量不能在JavaScript中声明为私有,公共等,但使用闭包可以隐藏只能在内部使用的变量。 E.g。

function Car() {
   var speed = 0;

   return {
      accelerate: function() {
         speed++;
      }
   }
}

var car = new Car();
car.accelerate();
由于关闭,speed可以访问

accelerate,但是其他方式完全无法访问。

答案 1 :(得分:1)

闭包的主要好处是你可以使用闭包“部分应用”一个函数,然后传递部分应用的函数,而不是需要传递非应用函数,以及你需要调用它的任何数据(在许多情况下非常有用)。

假设您有一个函数f,将来需要2个数据才能运行。一种方法是,当您调用它时,可以将两个部分作为参数传递。这种方法的问题在于,如果第一个数据立即可用,而第二个数据不可用,则必须使用f传递它,因此当您想要调用该函数时,它就在范围内。

另一种选择是立即向函数提供可用数据。您可以在数据上创建闭包,让函数引用外部数据,然后自行传递函数。

选项2更简单。

您还可以使用闭包在本机不支持它们的语言中的函数中实现静态变量。 Clojure(该语言)通过让它返回传递函数的修改版本来实现它的memoize函数,该函数保存对表示参数/返回值对的映射的引用。在运行函数之前,它首先检查参数是否已存在于映射中。如果是这样,它将返回缓存的返回值,而不是重新计算它。

(改编from my answer to another question

答案 2 :(得分:1)

由于这个问题并不需要程序化的答案,我正在添加答案而不是评论。 你在问题中引用的例子是,我同意一个闭包,我确信可以访问复数讲座,你很清楚闭包。因此,上述示例并不是闭包的唯一用例。闭包是记住它们创建范围的函数。

一个明显的例子是每个人在jQuery中使用的回调注册机制。到处都有封闭,我们中的许多人一直在不知不觉地写封闭。

因此,如果您使用了redux,您会知道整个概念基于闭包,即封装数据(称为应用程序状态)。 Closure提供了OOPS支持语言中使用的私有变量的概念。

我在下面添加了另一个闭包示例,因此您可以进行关联。

function processOrder(amount){
  var temp_order_id = +new Date() + 'USERID';
  var afterPaymentCompleteOrder = function(status){//callback
  //afterPaymentCompleteOrder is a closure as it remembers the scope in which it is created when it is being called. So when ivoked it remembers the value of temp_order_id
     if(status){
          complete_order_method(temp_order_id);
     }
     else
          delete_order_details(temp_order_id);
  }

  start_payment_process(amount, afterPaymentCompleteOrder);
}