首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除了信息隐藏在多范式/功能语言(如JavaScript )之外,闭包的真正价值主张是什么?

除了信息隐藏在多范式/功能语言(如JavaScript )之外,闭包的真正价值主张是什么?
EN

Stack Overflow用户
提问于 2015-01-15 22:50:45
回答 1查看 79关注 0票数 0

当我第一次尝试理解闭幕式的时候,我遇到了一堵无法穿透的纸墙,上面写着一堆难以理解的计算机科学,我必须先理解,然后才能接近封闭。然后,我更多地了解到,猴子做的基础,虽然JavaScript关键字不允许Java的成语,(请原谅我的模糊记忆这里):

JAVA:

代码语言:javascript
复制
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:

代码语言: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中,闭包可能比创建私有成员的后门方式更重要、更有趣。

除了在纯/多范式功能语言中隐藏信息的机制之外,还有其他主要用例吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-15 23:49:50

在我的经验中,隐私是一个次要的考虑因素,尤其是具有不可改变的价值观。为什么你在乎谁看到了,如果他们不能改变它?

要理解闭包的值,首先必须了解一流函数的值,然后很容易看出什么时候可以方便地将一些数据与该函数关联起来。

考虑尝试从维基百科页面中编写以下示例,而不使用闭包,但仍然使用filter高级函数:

代码语言:javascript
复制
// 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中,您将创建类似于以下内容的对象:

代码语言:javascript
复制
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和谓词函数都更加复杂和耦合。闭包现在看起来不错了,对吗?

还有很多情况下,闭包极大地减少了耦合,并简化了使用高阶函数的代码。这是为什么功能程序如此简洁的一个主要原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27974477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档