嘿,我在Google文章(here)上读到,在使用闭包时我们需要小心 例如,他们给了这个功能:
function foo(element, a, b) {
element.onclick = function() { /* uses a and b */ };
}
我引用:
函数闭包保持对element,a和b的引用,即使它从不使用元素。由于element还保留了对闭包的引用,因此我们有一个循环,不会被垃圾收集清理。
我还阅读了关于module pattern
的文章,并且在闭包中有很多用途
例如,如果我声明一个类似的模块:
(function () {
var a = function () { };
var b = function () { };
}());
因此b
可以访问a
,这意味着它还可以保存对模块上声明的所有函数的引用。
它也被认为是不好的做法吗?
答案 0 :(得分:2)
你引用的陈述是垃圾。
函数闭包保持对element,a和b的引用,即使它从不使用元素。
由于element还保持对闭包的引用,因此我们有一个循环,不会被垃圾收集清理。
(1:我们倾向于忽略古老的越野车探险家)
所以回答你的问题:不,这些都不是坏习惯。
答案 1 :(得分:1)
是的,我们需要小心使用任何高级功能,但简短的回答是他们可以发挥有用的作用。
关闭的目的是保留变量以供日后使用。如果你从不使用这些变量,那么显然你会不必要地依赖数据。
JavaScript垃圾收集非常好,而且越来越好了。但是当你真正完成一个变量时它仍然需要尝试解决,而且它不是通灵的。
另一方面,使用闭包最重要的部分是它们允许您定义有限范围的变量,因此您可以减少对全局变量的依赖,这绝对比一些额外的闭包变量更有问题。
闭包变量的真正问题不是它们消耗的额外内存,而是应用时的误解。例如,在分配了值之后,许多新的JavaScript开发人员在找到循环变量时都会被保留。
许多JavaScript开发人员使用卡车装载的库来填充他们的代码,这些库创建了大量复杂的对象来执行简单的任务。这将是一个要考虑的更大成本。
简短的回答是,明智地使用,闭包很有价值,而且往往是执行任务的最佳方式。