在闭包中公开数组的状态,而不允许从外部对其进行编辑

Exposing state of array in a closure without allowing it to be edited from the outside

本文关键字:从外部 不允许 编辑 闭包 数组 状态      更新时间:2023-09-26

我正在开发一个简单的井字游戏,其中我有一个代表比赛场地并包含游戏逻辑的揭示模块,而无需了解 DOM:

var gameBoard = function() {
    var createBackingArray = function(size) {
        var f = new Array(size);
        for (var i = 0; i < size; i++) {
            f[i] = new Array(size);
        }
        return f;
    };
    var field = createBackingArray(3);
    var getField = function(){
        //Return a copy of the array to prevent the field 
        //from being manipulated from firebug, etc.
        return field.slice(0); 
    }
    var isFreeToPlay = function(x, y) { //stuff };
    var playField = function(x, y, player) { //stuff };
    return {
        getField: getField,
        isFreeToPlay: isFreeToPlay,
        playField: playField
    };
}();

在另一个脚本中,我拥有所有与 DOM 相关的东西,例如

var createDomField = function(fieldData) {
    var table = $("<table/>");
    var length = fieldData.length;
    for (var row = 0; row < length; row++) {
        var newRow = $("<tr>");
        for (var cell = 0; cell < length; cell++) {
            var newCell = $("<td>");
            newCell.html(fieldData[row][cell]);
            newRow.append(newCell);
        }
        table.append(newRow);
    }
    return table;
};
var updateField = function(){
    var field = createDomField(gameBoard.getField());
    elem.fieldContainer.empty();
    elem.fieldContainer.append(field)
}

像上面一样创建数组的副本时,每次更新/重绘字段时,我会导致内存泄漏(例如,如果我调用 updateField 无数次(还是会在函数完成并且 DOM 更新时对重复的数组进行垃圾回收?

如果它不是GC-ed,有没有办法以某种方式手动清理它?

这是一种糟糕/丑陋的方式吗?有没有更好的方法来公开数组的状态,并在闭包中仍然将其"私有",以便无法使用开发工具/Firebug 对其进行操作?

一个想法是公开createBackingArray,而不是getField你可以populateFieldupdateField重用它自己用createBackingArray创建的数组实例,而只是用populateField重新获取数据。

下面是一个示例:http://pastie.org/8266775