JavaScript最佳实践,使用闭包

JavaScript最佳实践,使用闭包,javascript,Javascript,嘿,我在谷歌的文章()上读到,我们在使用闭包时需要小心。 例如,他们提供了以下功能: function foo(element, a, b) { element.onclick = function() { /* uses a and b */ }; } 我引述: 函数闭包保留对元素、a和b的引用,即使它从未使用元素。由于元素还保留对闭包的引用,所以我们有一个不会被垃圾收集清除的循环 我还读了一篇关于模块模式的文章,闭包有很多用途 例如,如果我声明这样的模块: (function ()

嘿,我在谷歌的文章()上读到,我们在使用闭包时需要小心。
例如,他们提供了以下功能:

function foo(element, a, b) {
    element.onclick = function() { /* uses a and b */ };
}
我引述:

函数闭包保留对元素、a和b的引用,即使它从未使用元素。由于元素还保留对闭包的引用,所以我们有一个不会被垃圾收集清除的循环

我还读了一篇关于模块模式的文章,闭包有很多用途

例如,如果我声明这样的模块:

(function () {
    var a = function () { };
    var b = function () { };
}());
因此
b
可以访问
a
,这意味着它还可以保存对模块上声明的所有函数的引用


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

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

闭包的目的是为以后保留变量。如果您从未使用过这些变量,那么显然您是在不必要地保留数据

JavaScript垃圾收集非常好,而且越来越好。但它仍然需要努力计算出你什么时候真正完成了一个变量,它不是通灵的

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

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

许多JavaScript开发人员在代码中塞满了大量的库,这些库创建了巨大而复杂的对象来执行简单的任务。这将是一个需要考虑的更大的成本。
简短的回答是,如果使用得当,闭包是有价值的,而且通常是执行任务的最佳方式。

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

闭包的目的是为以后保留变量。如果您从未使用过这些变量,那么显然您是在不必要地保留数据

JavaScript垃圾收集非常好,而且越来越好。但它仍然需要努力计算出你什么时候真正完成了一个变量,它不是通灵的

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

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

许多JavaScript开发人员在代码中塞满了大量的库,这些库创建了巨大而复杂的对象来执行简单的任务。这将是一个需要考虑的更大的成本。
简单的回答是,如果使用得当,闭包是有价值的,而且通常是执行任务的最佳方式。

您引用的语句是垃圾

函数闭包保留对元素、a和b的引用,即使它从未使用元素

由于元素还保留对闭包的引用,所以我们有一个不会被垃圾收集清除的循环

一,

(1:我们倾向于忽视老掉牙的互联网探索者)


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

你引用的说法是垃圾

函数闭包保留对元素、a和b的引用,即使它从未使用元素

由于元素还保留对闭包的引用,所以我们有一个不会被垃圾收集清除的循环

一,

(1:我们倾向于忽视老掉牙的互联网探索者)


因此,请回答您的问题:不,这些都是不错的做法。

这与其说是一个特定于代码的问题,不如说是一个讨论。顺便说一句,友好的提示:reAd,而不是red:)@Utkanos-实际上,我认为这是一个特定于代码的问题,尽管我对JavaScript的知识不够深入,无法回答这个问题。我相信引号表示函数sans参数包含对整个封闭范围的引用。这是否确实阻止了GC(除了在引用计数模型中,它不应该阻止),或者是否可以通过显式地将
a
b
传递给内部函数来避免不正确的引用,这是(我相信)这里真正的问题。这更像是一个讨论,而不是一个特定于代码的问题。顺便说一句,友好的提示:reAd,而不是red:)@Utkanos-实际上,我认为这是一个特定于代码的问题,尽管我对JavaScript的知识不够深入,无法回答这个问题。我相信引号表示函数sans参数包含对整个封闭范围的引用。这是否确实阻止了GC(除了在引用计数模型中,它不应该阻止),或者是否可以通过显式地将
a
b
传递给内部函数来避免不正确的引用,这是(我相信)这里真正的问题。