2012-07-16 28 views
8

我已经看过所有其他(优秀)答案(尤其是这个:How do JavaScript closures work?),但我希望你对我对这个概念的理解有所反馈。这是JavaScript封闭的有效用例吗?

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

另外一个,我觉得是有它作为一个厂发电机:

<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> 

此输出:

A toyota corolla has been create 
A toyota corolla has been created 
A honda civic has been created 

那么你认为其倒闭的有效使用情况下(即创建多个工厂使用相同的代码库)?或者我可以使用更好的东西来实现相同的目标?

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

谢谢。

+0

对我来说没关系。 – Almo 2012-07-16 00:23:01

+0

看起来不错!我没有看到任何错误。 – Linuxios 2012-07-16 00:24:28

+3

从技术上讲,你不需要'm' - 你可以直接使用'make'。 – josh3736 2012-07-16 00:33:33

回答

0

闭包是非常强大的构造,具有许多有用的用途。你在那里使用的那种实际上是一种“黑客”。闭包最常见的用法是,当你实现了一些在中间“做某些事情”的功能时......并且“做某事”可以根据需要进行更多或更少的配置......例如jQuery ajax功能当请求有错误,或者当它成功时,可以“做些什么”等等。 如果你没有关闭,你只能通过一个“静态定义”的功能,这可能需要从全局变量中收集所需的上下文以完成您想要的任务,或者您必须对所有函数使用相同的签名,例如在C或C++中完成的函数(如函数(customData)){} ... Closures允许你在运行时“动态构建函数”,重新创建它们创建时的上下文,这样你就可以以一种非常简单的方式传递给需要“做某件事”的模块,你会用c或C++或不用closu这是丑陋的,容易出错的,也是一种黑客)。

所以每当你必须“设置”里面的东西了一些自定义功能,您将使用一个封闭...

1

如果我正确理解你的问题,你不关心保持make私有财产?如果是这样的话,那么封闭是不是真的有必要,你可以使用原型实现相同的功能...

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

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

其中有相关的性能优势(降低内存和增加的速度),按this question

+1

这存储模型名称,但不保密。成员变量可供任何人使用。OP封闭的优势在于型号名称是真正私人的。 – jfriend00 2012-07-16 00:44:33

+0

是的,编辑我的答案是更具体一点。这只是一个可行的答案,如果保持'make'私密是不必要的。如果是,那么封闭是最好的解决方案。 – market 2012-07-16 00:48:49

+1

我认为在OP的问题中关闭的关键是隐私。我同意,如果不需要隐私,那么关闭会比需要更复杂(并且可能更糟糕的内存消耗)。如果是公共的,一个成员变量是最直接的。 – jfriend00 2012-07-16 00:56:17