javascript中闭包的具体实际应用

Posted

技术标签:

【中文标题】javascript中闭包的具体实际应用【英文标题】:Specific real life application of closures in javascript 【发布时间】:2017-08-18 08:31:15 【问题描述】:

我已经使用 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;

我的问题是我为什么要这样做,或者更确切地说是哪些特定情况可以让我考虑使用它。

【问题讨论】:

它应该是return function(otherVal)return anotherVal);,因为您使用val 覆盖了闭包。现在它是 val 的闭包。 闭包在回调中使用非常频繁,因此它们可以保留调用异步函数时绑定的变量的值。 我怀疑你真正的好奇心是关于高阶函数,而不是一般的闭包。 在此处添加演示 jsfiddle jsfiddle.net/guptaaditya24/2qveyn0w 相关帖子here。 【参考方案1】:

我在我的实用学士thesis(2.2.2) 中写了一些关于这个的内容

隐藏变量是闭包的一种有价值的用法。与其他一些语言相比,javascript 中的变量不能声明为私有、公有等,但是使用闭包可以隐藏只能在内部使用的变量。例如

function Car() 
   var speed = 0;

   return 
      accelerate: function() 
         speed++;
      
   


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

speed 由于关闭而可由accelerate 访问,但在其他情况下完全无法访问。

【讨论】:

【参考方案2】:

由于此问题不需要程序化答案,因此我添加的是答案而不是评论。 您在问题中引用的示例是,我同意闭包,并且我确信可以访问复数课程,您很了解闭包。因此,上述示例并不是闭包的唯一用例。闭包是记住创建它们的作用域的函数。

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

因此,如果您使用过 redux,您就会知道整个概念是基于闭包的,即封装数据(称为应用程序状态)。闭包提供了在 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);

【讨论】:

【参考方案3】:

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

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

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

选项 2 要简单得多。

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

(改编自from my answer to another question)

【讨论】:

以上是关于javascript中闭包的具体实际应用的主要内容,如果未能解决你的问题,请参考以下文章

闭包的实际应用

Javascript闭包

JavaScript闭包学习笔记(ife2015spring)

闭包与防抖节流

javascript中的闭包以及闭包应用

javascript—闭包