js内存组织 - 闭包与对象?

时间:2013-06-26 22:55:52

标签: javascript performance object closures

当我在JS中开发时,我经常面临在使用内部函数(闭包)捕获变量和使用对象之间的选择。

内在功能:

var x = ...;
var f = function() {
    // use x here
}

对象:

obj.x = ...;
obj.f = function() {
    // use x here
}

内在功能方法“感觉”更自然,但我很想知道 - 是否存在性能影响而担心以这种或那种方式做到这一点,以及做这种事情最惯用的方式是什么?

2 个答案:

答案 0 :(得分:2)

在普通PC具有8GB RAM的时代,闭包与对象属性的内存使用似乎无关紧要。在任何情况下,在非平凡的应用程序中,使用闭包或仅使用属性值是有意义的。

如果您有一个代码模块,那么对于仅由该模块的方法内部使用的变量使用闭包是有意义的。对于需要跨模块共享的值使用属性也是有意义的,而无需使用getter和setter(例如,您要使用obj.property而不是obj.getProperty())。

此外,属性访问比使用函数检索值更有效,但getter和setter可以提供重要的功能(例如值验证和完整性检查)而不是简单地读取或赋值。

与往常一样,根据适当的标准(速度,代码可维护性,健壮性,跨浏览器支持等)使用适合您应用的内容。

答案 1 :(得分:1)

实际上你在第二种情况下分配了额外的对象,否则它们看起来和我一样。

函数是JS中的第一类对象,只要你看到function(){},就很容易忘记 分配一个相对较胖的新函数对象。您可以将其视为看到new Function()被调用 如果这使得对象分配对你来说更明显。

只有当你有一个“构造函数”来定义其中的函数并返回指向这些函数的对象时,这才有害。 这些函数中的每一个都是在您从构造函数创建的对象之上创建的单独对象。功能 根据数据和方法的数量,将比对象及其数据本身容易多占用10-100倍的内存。

如果您正在编写应用程序,则很容易考虑您是否需要担心它。如果你知道的话 你的应用程序根本不会创建很多对象,因此在更大的范围内浪费内存并不是那么糟糕。如果你是 编写通用库等,请不要为需求不能的应用程序开发人员做出这些假设 预测。