2

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

    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)};
4

3 回答 3

0

在您的示例中,将makeSizer()return 设为函数将意味着更少的代码。

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

对比

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)};
于 2012-10-25T13:56:09.393 回答
0

你可以用闭包做很多事情。关于您的问题:闭包用于设置部分功能。当柯里化出现时,这种技术用于函数式编程。柯里化意味着在每个参数传递并返回它的结果之后调用一个函数。主要是一个部分函数,​​但是当所有参数都被传递时,它将返回最终值。您只是通过显式返回一个新函数来假装做的那种技术。

为什么有用?好吧,它是一种函数式编程技术,您可以将其与面向对象编程中的部分类进行比较。

在某些情况下,这个概念很有用。阅读我在software-innovators.nl上的博客,了解深入的示例。

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

于 2012-10-25T13:57:50.943 回答
0

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

使用闭包的另一个好处可能是它们可用于在 JavaScript 中使成员私有,如本文所述

于 2012-11-18T20:26:05.167 回答