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上的博客,了解一个内容示例。
请记住,这是需要关闭的更多示例之一。
在您的示例中,使
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)}; |