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(); |
由于关闭,
由于这个问题不需要程序化的答案,我正在添加答案而不是评论。
你在问题中引用的例子是,我同意一个闭包,我确信可以访问复数讲座,你很清楚闭包。因此,上述示例并不是闭包的唯一用例。闭包是记住它们创建范围的函数。
一个明显的例子是每个人在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); } |
闭包的主要好处是你可以使用闭包"部分应用"一个函数,然后传递部分应用的函数,而不是需要传递非应用函数,以及你需要调用它的任何数据(非常有用) ,在许多情况下)。
假设您有一个函数
另一种选择是立即向函数提供可用数据。您可以在数据上创建闭包,让函数引用外部数据,然后自行传递函数。
选项2更简单。
您还可以使用闭包在函数中实现静态变量,这些变量本身不支持它们。 Clojure(该语言)通过返回传递函数的修改版本来实现它的
(改编自我对另一个问题的回答)