JavaScript最佳实践,使用闭包

时间:2017-04-01 10:35:32

标签: javascript

嘿,我在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,这意味着它还可以保存对模块上声明的所有函数的引用。

它也被认为是不好的做法吗?

2 个答案:

答案 0 :(得分:2)

你引用的陈述是垃圾。

  

函数闭包保持对element,a和b的引用,即使它从不使用元素。

No it doesn't

  

由于element还保持对闭包的引用,因此我们有一个循环,不会被垃圾收集清理。

No they will 1

(1:我们倾向于忽略古老的越野车探险家)

所以回答你的问题:不,这些都不是坏习惯。

答案 1 :(得分:1)

是的,我们需要小心使用任何高级功能,但简短的回答是他们可以发挥有用的作用。

关闭的目的是保留变量以供日后使用。如果你从不使用这些变量,那么显然你会不必要地依赖数据。

JavaScript垃圾收集非常好,而且越来越好了。但是当你真正完成一个变量时它仍然需要尝试解决,而且它不是通灵的。

另一方面,使用闭包最重要的部分是它们允许您定义有限范围的变量,因此您可以减少对全局变量的依赖,这绝对比一些额外的闭包变量更有问题。

闭包变量的真正问题不是它们消耗的额外内存,而是应用时的误解。例如,在分配了值之后,许多新的JavaScript开发人员在找到循环变量时都会被保留。

许多JavaScript开发人员使用卡车装载的库来填充他们的代码,这些库创建了大量复杂的对象来执行简单的任务。这将是一个要考虑的更大成本。

简短的回答是,明智地使用,闭包很有价值,而且往往是执行任务的最佳方式。