![]() |
1
6
你可能会得到一大堆好答案。一个肯定的负面因素是Internet Explorer循环引用内存泄漏。基本上,JScript不会将对DOM对象的“循环”引用识别为可收集的。使用闭包很容易创建IE认为的循环引用。第二个链接中提供了几个示例。 在IE6中,回收内存的唯一方法是终止整个过程。在IE7中,他们对其进行了改进,这样当您离开有问题的页面(或关闭它)时,内存就会被回收。在IE8中,JScript更好地理解DOM对象,并按照预期的方式收集它们。 IE6的建议解决方案(除了终止进程!)不使用闭包。 |
![]() |
2
6
关闭会带来很多好处……但也会带来很多好处。如果你不小心的话,同样的事情也会让他们变得强大,很有可能把事情搞得一团糟。 除了循环引用的问题(这不再是真正的问题了,因为IE6在中国以外几乎没有被使用过),至少还有一个巨大的潜在负面因素: 它们会使范围复杂化。 如果使用得当,它们通过允许函数共享数据而不暴露数据来提高模块性和兼容性……但是如果使用得不好,就很难准确跟踪变量的设置或更改位置。 没有闭包的javascript有三个 * 变量范围:块级别、函数级别和全局。没有对象级作用域。如果不使用闭包,您就知道变量要么在当前函数中声明,要么在全局对象中声明(因为全局变量就位于此)。 有了闭包,您就不再有那个保证了。每个嵌套函数都引入了另一个级别的作用域,并且在该函数中创建的任何闭包请参见( 主要地 )与包含函数相同的变量。最大的问题是,每个函数都可以任意定义自己的变量来隐藏外部变量。
正确使用闭包要求您(a)了解闭包和
考虑这个例子:
简短、直截了当……几乎可以肯定是破碎的。手表:
数组输出中的每个函数
创建闭包时,它们不使用
为了解决这个问题,您需要另一个关闭。
另一个例子:
指定一个
最常见的成语
但这使得
因为 吊装 . javascript有效地将所有变量声明移动到函数的顶部。这使得上面的代码等价于
*ES7。以前,只有两个变量,变量更容易被跟踪。P
?使用lambda语法(ES7新增)声明的函数不重新定义
^新的解释器支持所谓的“严格模式”:一种选择加入功能,旨在使某些不确定的代码模式要么完全失败,要么造成更少的损害。在严格模式下,
|
![]() |
3
0
关闭可能会导致内存泄漏,但是Mozilla已经尝试优化其垃圾收集引擎来防止这种情况发生。 我不确定铬是如何处理关闭。我觉得他们和Mozilla不相上下,但我不想肯定地说。IE8肯定比早期版本的IE有所改进——它几乎是一个全新的浏览器,还有一些细微差别。 您还应该对代码进行基准测试,以查看速度是否有任何改进。 |
![]() |
Abhijit Sarkar · 如何修复“闭包可能比当前函数更有效” 3 年前 |
![]() |
Houman · 如果未调用闭包,如何使XCTest失败? 7 年前 |
![]() |
Kapil_A · 如何将swift中使用的闭包写入目标c? 7 年前 |
![]() |
Xendar · Jenkins管道模拟Groovy 7 年前 |
![]() |
Ibrahim Mohammed · 函数不考虑闭包 7 年前 |