V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
vevlins
V2EX  ›  JavaScript

基于强引用散列表实现私有变量的一个问题

  •  
  •   vevlins · 2018-03-18 21:13:54 +08:00 · 2605 次点击
    这是一个创建于 2428 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var Person = (function() {
    
        var privateData = {},
            privateId = 0;
    
        function Person(name) {
            Object.defineProperty(this, "_id", { value: privateId++ });
    
            privateData[this._id] = {
                name: name
            };
        }
    
        Person.prototype.getName = function() {
            return privateData[this._id].name;
        };
    
        return Person;
    }());
    
    

    这是我从一个博客粘贴过来的代码,其中博主有这么一句话:‘散列表 privateData 对每个实例都是强引用,导致实例不能被垃圾回收处理。如果存在大量实例必然会导致 memory leak ’。

    privateData 引用了实例嘛? 我觉得 privateData 里不是只是 id-name 的映射,name 不也是字符串吗?

    3 条回复    2018-03-19 12:12:16 +08:00
    MinonHeart
        1
    MinonHeart  
       2018-03-18 23:45:37 +08:00 via iPhone   ❤️ 1
    多实例对应单个 privatedata。这种是方便查找 id 对应的数据,否则没必要这样设计。内存泄露,一般不会,除非一直 new person
    sunjourney
        2
    sunjourney  
       2018-03-19 01:25:49 +08:00   ❤️ 1
    尽信书不如无书,这样用没问题的。哪怕 name 是个对象也没问题,实例销毁 privateData 也没引用了
    vevlins
        3
    vevlins  
    OP
       2018-03-19 12:12:16 +08:00
    @MinonHeart 我觉得 privatedata 内没有引用实例,只是存储了它的_id,这个想法对吗
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1714 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:43 · PVG 00:43 · LAX 08:43 · JFK 11:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.