JavaScript闭包的用法

Usage of JavaScript Closures

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

1
2
3
4
5
6
7
8
9
10
11
12
13
    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;

但是为什么我会这样做,而我可以轻松创建这样的功能

1
2
3
4
5
6
7
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)};


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

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


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

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

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

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


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

1
2
3
4
5
6
7
8
9
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);

1
2
3
4
5
6
7
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)};