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

Specific real life application of closures in javascript

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

1
2
3
4
5
6
function expClosure(val){
   //do something to val-->anotherVal
   return function(val){return anotherVal)};
}
var exp = expClosure(val);
exp(); --> returns the value of anotherVal;

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


我在实用的学士论文中写了一些这方面的内容(2.2.2)

隐藏变量是闭包的有用用法。与其他语言相比,JavaScript中的变量不能声明为private,public等,但使用闭包可以隐藏只能在内部使用的变量。例如。

1
2
3
4
5
6
7
8
9
10
11
12
function Car() {
   var speed = 0;

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

var car = new Car();
car.accelerate();

由于关闭,speed可以通过accelerate访问,但是否则完全无法访问。


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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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);
}


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

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

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

选项2更简单。

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

(改编自我对另一个问题的回答)