当我第一次尝试理解闭幕式的时候,我遇到了一堵无法穿透的纸墙,上面写着一堆难以理解的计算机科学,我必须先理解,然后才能接近封闭。然后,我更多地了解到,猴子做的基础,虽然JavaScript关键字不允许Java的成语,(请原谅我的模糊记忆这里):
JAVA:
class ObjectWithPrivateMember()
{
private int counter;
public void ObjectWithPrivateMember()
{
counter = 0;
}
public void increment()
{
counter += 1;
}
public void decrement()
{
counter -= 1;
}
public void get_count()
{
return counter;
}
}JavaScript (几年前的ECMAScript)没有真正的“私有”/“受保护”关键字,但是对Java成语的免费翻译可能如下所示:
JAVASCRIPT:
var object_with_private_member = function()
{
var counter = 0;
return {
increment: function()
{
counter += 1;
},
decrement: function()
{
counter -= 1;
},
get_count: function()
{
return counter;
}
};
}();除了我对"Ewwwww,管道胶带,试图把JavaScript装扮成不一样的东西“的直接反应之外,我还在心里写了这样的话:”好吧,这就是如何用JavaScript的模糊细节来支撑Java的成语。这很可能让人无法直接洞察JavaScript的伟大之处。“
现在我回到了的问题“闭包到底对什么有好处?”,维基百科条目给出了一些细节,并建议信息隐藏可能是一个主要的用例,不只是在功能很重的多范式语言中,而是对于一流函数式语言的常见怀疑。当然,它更详细,也提供了更多的细微差别,但它表明,教科书中的“带有私有字段的JavaScript对象”用例并不像我想象的那样切入。
一个好的函数式程序员会看到什么是真正的用例,用纯函数式语言或功能倾向的多范式语言进行闭包?它们主要用于信息隐藏(维基百科文章比上面的漫画提供更多的细微差别和细节,但至少一开始我的想法是,在JavaScript中,闭包可能比创建私有成员的后门方式更重要、更有趣。
除了在纯/多范式功能语言中隐藏信息的机制之外,还有其他主要用例吗?
发布于 2015-01-15 23:49:50
在我的经验中,隐私是一个次要的考虑因素,尤其是具有不可改变的价值观。为什么你在乎谁看到了,如果他们不能改变它?
要理解闭包的值,首先必须了解一流函数的值,然后很容易看出什么时候可以方便地将一些数据与该函数关联起来。
考虑尝试从维基百科页面中编写以下示例,而不使用闭包,但仍然使用filter高级函数:
// Return a list of all books with at least 'threshold' copies sold.
function bestSellingBooks(threshold) {
return bookList.filter(
function (book) { return book.sales >= threshold; }
);
}您需要找到将threshold与谓词函数通信的其他方式。在OOP中,您将创建类似于以下内容的对象:
class ThresholdFilter implements Filterable {
private threshold;
ThresholdFilter(threshold) {
this.threshold = threshold;
}
bool filter(book) {
return book.sales >= this.threshold;
}
}
function bestSellingBooks(threshold) {
return bookList.filter(new ThresholdFilter(threshold));
}或者,您可以更改filter函数以接受某种要存储和传递的私有泛型数据结构,这使得filter和谓词函数都更加复杂和耦合。闭包现在看起来不错了,对吗?
还有很多情况下,闭包极大地减少了耦合,并简化了使用高阶函数的代码。这是为什么功能程序如此简洁的一个主要原因。
https://stackoverflow.com/questions/27974477
复制相似问题