这是javascript闭包的有效用例吗?

这是javascript闭包的有效用例吗?,javascript,closures,application-design,Javascript,Closures,Application Design,我已经看过了所有其他(优秀的)答案(特别是这个:),但我想得到你对我对这个概念理解的反馈 我知道一个用例是对公共访问隐藏私有方法的实现 我想到的另一个是将其作为工厂发电机: <script> function carFactory( make ) { var m = make; return { manufacture: function ( model ) {console.log("A " + m + " " + model + " has

我已经看过了所有其他(优秀的)答案(特别是这个:),但我想得到你对我对这个概念理解的反馈

我知道一个用例是对公共访问隐藏私有方法的实现

我想到的另一个是将其作为工厂发电机:

<script>

function carFactory( make ) {

    var m = make;
    return { manufacture: function ( model ) 

        {console.log("A " + m + " " + model + " has been created");}

    }
}

toyotaFactory = carFactory("toyota");
hondaFactory = carFactory("honda");

toyotaFactory.manufacture("corolla");
toyotaFactory.manufacture("corolla");
hondaFactory.manufacture("civic");

</script>
那么您认为它是闭包的有效用例(即使用相同的代码库创建多个工厂)吗?或者我能用更好的东西实现同样的目标吗

请注意,问题不是关于闭包的技术实现,而是关于应用程序设计/开发中的有效用例


谢谢。

是的,保持变量私有是闭包的有效用法。它允许您对变量进行私有访问,而无需使其成为公共成员


有关其他示例,请参见本参考资料:

闭包是非常强大的构造,具有许多有用的用途。你在那里用的那个实际上是一种“黑客”。闭包的最常用的用法是当你在中间实现了一些“做某事”的功能时…而且“做点什么”可以配置成或多或少你想要的任何东西。。。例如,当请求出现错误或成功时,jQuery ajax功能可以“做一些事情”,等等。。。 如果没有闭包,你只能传递一个“静态定义”函数,它可能需要收集从全局变量中做任何你想做的事情所需的上下文,或者你必须使用所有函数,比如C或C++函数(Cuto DATA){}所做的相同的签名。 闭包允许你在运行时“动态地构建函数”,重新创建它们创建时的上下文,这样你就可以通过一种非常简单的方式(需要与C或C++中的或者没有闭包的契约),传递给那些需要“做一些事情”的模块,这是丑陋的,容易出错的,也是黑客攻击的。
因此,每当您必须“配置”某个内容中的某些自定义功能时,您都会使用闭包…

如果我正确理解您的问题,您不关心保持
make
属性私有吗?如果是这样的话,那么闭包就没有必要了,您可以使用原型实现相同的功能

function carFactory(model){
  this.m = make;
}

carFactory.prototype.manufacture = function(model){
  console.log('A ' + this.m + ' ' + model + ' has been created');
}

它具有相关的性能优势(减少内存和提高速度),如

我试图提出一个信息隐藏/封装的实际例子,这就是我目前的尝试

“严格使用”;
客户银行=(账户持有人姓名,初始存款)=>{
让余额=初始存款;
常量添加=(金额)=>{
余额+=金额;
}
让我们减去=(金额)=>{
余额-=金额
}
让printBalance=()=>{
log(accountHolderName,“有余额”,余额,“美元”);
}
返回{
信用:加上,
借方:减去,
余额:打印余额
}
}
设艾米=银行(“艾米”,1000);
amy.balance();
amy.学分(100);
amy.balance();
a.借方(10);
amy.balance();
设sam=银行(“sam”,50);
sam.balance();
山姆·克鲁德(50);
sam.balance();
sam.debit(100);
sam.balance();
一旦运行,您将获得以下输出

艾米有1000美元的余额
艾米有1100美元的余额
艾米有1090美元的余额
萨姆有50美元的余额
萨姆有100美元的余额
萨姆有0美元的余额
好处是什么

  • 余额
    变量不能直接访问
  • 通过使用闭包,每个调用方都可以获得自己的数据。艾米的
    余额
    没有干扰山姆的
    数据
  • 调用方(
    Amy
    Sam
    等)有一个很好的API可以使用,而不用担心
    bank
    如何运行的内部细节

我还缺什么吗?

看起来不错!我看不出有什么问题。从技术上讲,你不需要
m
——你可以直接使用
make
。非常感谢大家(almo、linuxios、josh、jfriend等),你的评论增加了我对闭包理解的信心和知识。这会存储模型名称,但不会将其保密。任何人都可以使用成员变量。OP闭包的优点是模型名是真正私有的。是的,编辑了我的答案,让它更具体一点。如果不需要保持
make
private,那么这只是一个可行的答案。如果是的话,那么关闭是最好的解决方案。我认为OP问题中关闭的全部要点是隐私。我同意,如果不需要隐私,那么关闭就比需要的更复杂(可能更糟糕的内存消耗)。如果是公共的,则成员变量是最简单的。是的,它是(尽管我的示例使它看起来不那么重要),但我试图理解的概念是,当我想保持数据私有时(就像没有人可以在创建工厂后更改工厂)。。但market的帖子总体上对我(希望其他人)来说是很好的知识。制造方法可以被替换以返回不同的品牌,因此您在隐私(以及隐含的安全性)方面回到了起点。
function carFactory(model){
  this.m = make;
}

carFactory.prototype.manufacture = function(model){
  console.log('A ' + this.m + ' ' + model + ' has been created');
}