![]() |
1
203
我用闭包做过如下事情:
如你所见,
这是一个很小的例子,但也许你能看到它的用途?我们用它来执行公共/私有方法。 |
![]() |
2
119
假设,你想
计算用户单击按钮的次数
在网页上。
现在可能有很多方法,比如:1)你可以使用 全局变量 ,以及一个函数来增加 柜台 :
但是,陷阱是
页面上的任何脚本都可以更改计数器,而无需调用
2)现在,您可能正在考虑在函数中声明变量:
但是,嘿!每一次
3)思考 嵌套函数 ?
嵌套函数可以访问它们上面的作用域。
如果你能找到
4) 结束救援!(自调用函数) :
自调用函数只运行一次。它设置了
这种方式
这叫做 javascript闭包 . 它使函数有可能 私有的 “变量。
这个
更生动的结束示例:
|
![]() |
3
62
你举的例子很好。闭包是一种抽象机制,允许您非常清晰地分离关注点。您的示例是将检测(计数调用)与语义(错误报告api)分离的情况。其他用途包括:
|
![]() |
4
18
是的,这是一个有用的结束的好例子。对warnuser的调用创建
我在stackoverflow上看到的最常见的问题是,有人希望“延迟”使用在每个循环上增加的变量,但由于变量的作用域是限定的,因此对变量的每个引用都将在循环结束后进行,从而导致变量的结束状态:
这将导致每个警报显示相同的值
|
![]() |
5
13
特别是在javascript(或任何ecmascript)语言中,闭包在隐藏功能实现的同时仍然显示接口方面非常有用。 例如,假设您正在编写一类日期实用程序方法,您希望允许用户按索引查找工作日名称,但不希望他们能够修改您在引擎盖下使用的名称数组。
请注意
|
![]() |
6
8
我知道我回答这个问题的时候已经很晚了,但这可能有助于任何人在2018年仍在寻找答案。 javascript闭包可用于实现 节流阀 和 去抖动 应用程序中的功能。 节流 : 限制将函数的最大调用次数限制为一段时间。如“每100毫秒最多执行一次此函数”。 代码:
去抖动 : 去噪限制了一个函数在没有被调用的情况下经过一定时间后才被再次调用。就像“只有在100毫秒没有被调用的情况下才执行这个函数”。 代码:
如您所见,闭包帮助实现了两个漂亮的特性,每个web应用程序都应该提供平滑的ui体验功能。 我希望它能帮助别人。 |
![]() |
7
6
有一个关于 Practical Closures 在 Mozilla Developer Network . |
![]() |
8
5
闭包的另一个常见用途是绑定
每当鼠标移动事件发生时,
闭包也是高阶函数的重要组成部分,允许通过参数化不同部分,将多个相似函数重写为单个高阶函数的非常常见的模式。作为一个抽象的例子,
变成
其中a和b不是语法单位,而是源代码字符串(不是字符串文本)。 见“ Streamlining my javascript with a function “举个具体的例子。 |
![]() |
9
5
在这里,我有一个问候,我想说几次。如果我创建一个闭包,我可以简单地调用该函数来记录问候语。如果我不创建闭包,我必须每次都传入我的名字。 没有结束( https://jsfiddle.net/lukeschlangen/pw61qrow/3/ ):
结束了( https://jsfiddle.net/lukeschlangen/Lb5cfve9/3/ ):
|
![]() |
10
4
如果您对在面向对象的意义上实例化类(即创建该类的对象)的概念感到满意,那么您就接近于理解闭包了。 这样想:当您实例化两个人对象时,您知道类成员变量“name”不是在实例之间共享的;每个对象都有自己的“copy”。类似地,当您创建闭包时, 自由变量 (“calledCount”在上面的示例中)已绑定到函数的“instance”。 我认为,warnuser函数返回的每个函数/闭包(旁白:这是 高阶函数 )闭包用相同的初始值(0)绑定“calledCount”,而通常在创建闭包时,将不同的初始值设定项传递给高阶函数更为有用,这与将不同的值传递给类的构造函数非常相似。 因此,假设当“calledCount”达到某个值时,您希望结束用户的会话;根据请求是来自本地网络还是来自大而坏的Internet,您可能需要不同的值(是的,这是一个人为的示例)。为了实现这一点,您可以将calledcount的不同初始值传递给warnuser(即-3或0?). 文献的部分问题是用来描述它们的命名法(“词汇范围”,“自由变量”)。不要让它愚弄你,闭包比看起来更简单…表面上看;-) |
![]() |
11
2
这里我有一个简单的闭包概念的例子,我们可以在我们的电子商务网站或其他许多网站上使用。 我将在示例中添加jsfiddle链接。 它包含一个小产品列表,包含3个项目和一个购物车计数器。
|
![]() |
12
1
我曾经写过一篇文章,介绍如何使用闭包来简化事件处理代码。它比较了asp.net事件处理和客户端jquery。 http://www.hackification.com/2009/02/20/closures-simplify-event-handling-code/ |
![]() |
13
1
我喜欢Mozilla的函数工厂 example .
|
![]() |
14
1
javascript模块模式使用闭包。它的良好模式允许您拥有类似“公共”和“私人”的变量。
|
![]() |
15
0
闭包的使用: 闭包是javascript最强大的功能之一。javascript允许函数嵌套,并授予内部函数对外部函数中定义的所有变量和函数(以及外部函数可以访问的所有其他变量和函数)的完全访问权。但是,外部函数不能访问内部函数中定义的变量和函数。这为内部函数的变量提供了一种安全性。此外,由于内部函数可以访问外部函数的范围,如果内部函数设法在外部函数的生命周期之外生存,则外部函数中定义的变量和函数将比外部函数本身寿命长。当内部函数以某种方式可用于外部函数之外的任何范围时,将创建闭包。 例子:
在上面的代码中,内部函数可以访问外部函数的name变量,除了通过内部函数之外,没有其他方法可以访问内部变量。内部函数的内部变量作为内部函数的安全存储。它们保存“持久的”,但安全的数据,供内部函数使用。这些函数甚至不必赋给变量,也不必有名字。 阅读 here 细节 |
![]() |
16
0
参考文献: Practical usage of closures 实际上,闭包可以创建优雅的设计,允许定制各种计算、延迟调用、回调、创建封装范围等。 数组的sort方法示例,它接受sort condition函数作为参数:
映射函数作为数组的映射方法,它根据函数参数的条件映射新数组:
通常,通过使用定义几乎无限搜索条件的函数参数来实现搜索函数是很方便的:
此外,我们可能会注意到应用函数,例如,将函数应用于元素数组的foreach方法:
函数应用于参数(应用中的参数列表和调用中的定位参数):
延迟呼叫:
回调函数:
为隐藏辅助对象而创建封装作用域:
|
![]() |
17
0
|
![]() |
18
0
闭包是创建 generators ,按需递增的序列:
差异总结如下: Anonymous functions Defined functions Cannot be used as a method Can be used as a method of an object Exists only in the scope in which it is defined Exists within the object it is defined in Can only be called in the scope in which it is defined Can be called at any point in the code Can be reassigned a new value or deleted Cannot be deleted or changed 工具书类 |
![]() |
19
0
这个线程极大地帮助我更好地理解了闭包是如何工作的。此后,我自己做了一些实验,并提出了这个相当简单的代码,它可以帮助其他人了解如何以实际的方式使用闭包,以及如何在不同级别使用闭包来维护类似于静态和/或全局变量的变量,而不必冒m被覆盖或与全局变量混淆。这样做的目的是跟踪每个按钮在本地和全局级别上的单击,计算每个按钮的单击次数,从而形成一个图形。注意,我并没有使用任何全局变量来实现这一点,这是练习的一个要点——拥有一个可以应用于任何按钮的处理程序,该按钮也可以对全局的内容做出贡献。 请专家们,如果我在这里犯了什么错误,一定要告诉我!我自己还在学。
|
![]() |
20
0
在给定的示例中,封闭变量“counter”的值受到保护,并且只能使用给定的函数(increment、decrement)进行更改。因为它已经结束了,
|