JavaScript闭包的用法

时间:2012-10-25 13:47:31

标签: javascript closures

在阅读JavaScript中的闭包后,我仍然无法理解它们在哪里使用?如果没有闭包那么事情将如何交替进行(如果可能的话)以及闭包的使用简化了什么。如果有人可以用JavaScript中的一些代码示例解释这一点,那将会有所帮助。任何解释这一点的文章的链接也是受欢迎的。 我已阅读this中提到的similar question文章。它用这样的代码解释

    function makeSizer(size) {
      return function() {
        document.body.style.fontSize = size + 'px';
      };
    }

    var size12 = makeSizer(12);
    var size14 = makeSizer(14);
    var size16 = makeSizer(16);

document.getElementById('size-12').onclick = size12;
document.getElementById('size-14').onclick = size14;
document.getElementById('size-16').onclick = size16;

但是为什么我会这样做呢,而我可以轻松地创建像这样的函数

function sizer(size) {
            document.body.style.fontSize = size + 'px';
          };

    document.getElementById('size-12').onclick = function(){sizer(12)};
    document.getElementById('size-14').onclick = function(){sizer(14)};
    document.getElementById('size-16').onclick = function(){sizer(16)};

3 个答案:

答案 0 :(得分:0)

在您的示例中,使makeSizer()返回一个函数意味着更少的代码。

function makeSizer(size) {
    return function() {
        document.body.style.fontSize = size + 'px';
    };
}

document.getElementById('size-12').onclick = makeSizer(12);
document.getElementById('size-14').onclick = makeSizer(14);
document.getElementById('size-16').onclick = makeSizer(16);

VS

function sizer(size) {
    document.body.style.fontSize = size + 'px';
};

document.getElementById('size-12').onclick = function(){sizer(12)};
document.getElementById('size-14').onclick = function(){sizer(14)};
document.getElementById('size-16').onclick = function(){sizer(16)};

答案 1 :(得分:0)

您可以使用闭包执行多项操作。关于你的问题:闭包用于设置部分功能。当curry进入场景时,该技术用于函数编程。 Currying意味着在每个参数传递并返回结果后调用函数。通常是部分函数,​​但是当所有参数都被传递时,它将返回最终值。你通过明确地返回一个新函数假装做的那种技术。

为什么有用?那么,它是一种函数式编程技术,可以与对象或类型编程中的部分类进行比较。

有些情况下这个概念很有用。请阅读software-innovators.nl上的博客,了解内容示例。

请记住,这是需要关闭的更多示例之一。

答案 2 :(得分:0)

我认为这个SO答案几乎可以解释这个概念。 阅读本文后,我的理解是闭包是将函数作为第一类对象。作为第一类对象的函数非常有用,因为它们可以像参数一样传递并使某些事情变得非常简单。

使用闭包的另一个好处是,它们可以用于在JavaScript中使成员保密,如post中所述。