【问题标题】:Javascript storage size of simple object vs. closure简单对象与闭包的 Javascript 存储大小
【发布时间】:2015-11-14 03:04:39
【问题描述】:

假设我想要一个有 2 个字段的对象,ab

function createObject (a, b) {
    return { a: a, b: b };
}

但是如果我想控制访问,比如让它只读,我可以使用闭包:

function createObject (aParam, bParam) {
    var a = aParam, b = bParam;
    return {
        a: function () { return a; },
        b: function () { return b; }
    }
}

闭包方法需要多少额外的存储空间?以这种方式创建的每个对象是否都有这两个访问函数的唯一副本?

【问题讨论】:

  • 当然它会使用更多的存储空间,因为对象具有检索不需要的值的功能。并且访问会更慢,因为函数调用比直接属性访问有更多的开销。但这是否会对性能产生任何实际影响是一个更重要的问题。
  • @RobG - 我倾向于担心鼠标移动事件处理程序中的对象分配,真的尽量避免让 GC 中断拖动或类似的事情。我不太担心函数调用的成本。

标签: javascript memory closures


【解决方案1】:

它需要多少内存取决于引擎,但它必须存储闭包以及 getter 方法,这些方法会为每个创建的新实例复制。它还会减慢执行速度,因为每次您想要访问变量时都需要运行该方法,并且它会降低代码的可读性(当您想要使用它时,您需要调用 .a() 而不仅仅是 .a)。

我不会使用它,因为没有什么可以阻止某人通过这样做来替换值:

obj = createObject('original', 'values');
obj.a(); // returns 'original'

obj.a = function() { return 'modified'; };
obj.a(); // returns 'modified'

顺便说一句,将参数名称放在括号中与在函数体内声明变量相同。换句话说,您不需要在代码中包含 paramA 和 paramB。效果很好:

function createObject (a, b) {
    return {
        a: function () { return a; },
        b: function () { return b; }
    }
}

没有完美的方法来保护 JS 中的变量而不会造成可怕的开销,所以最好的办法是放置一个下划线前缀或使用下划线作为私有属性的后缀,就像在 python 中一样。我更喜欢使用前缀,因此当有人使用我制作的库时,私有变量不会出现在自动完成中。然后你就可以在原型中实际编写getter了,所以方法只有一份:

function Foo(a, b) {
    this._a = a;
    this._b = b;
}

Foo.prototype.getA = function() { return _a; };
Foo.prototype.getB = function() { return _b; };

这根本不会使_a_b 成为私有,但它确实告诉任何使用您的代码的人他们不应该访问它们。如果他们太笨了,没有打破一切,那不再是你的问题了。

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 1970-01-01
    相关资源
    最近更新 更多