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

Javascript 在闭包中公开数组的状态,而不允许从外部对其进行编辑,javascript,garbage-collection,closures,Javascript,Garbage Collection,Closures,我正在开发一个简单的Tic-Tac-Toe游戏,其中有一个显示模块,表示游戏场,包含游戏逻辑,而不知道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);

我正在开发一个简单的Tic-Tac-Toe游戏,其中有一个显示模块,表示游戏场,包含游戏逻辑,而不知道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
    };

}();
var gameBoard=function(){
var createBackingArray=函数(大小){
var f=新数组(大小);
对于(变量i=0;i
在另一个脚本中,我有所有与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)
}
var createDomField=函数(fieldData){
变量表=$(“”);
变量长度=fieldData.length;
对于(变量行=0;行<长度;行++){
var newRow=$(“”);
对于(变量单元格=0;单元格<长度;单元格++){
var newCell=$(“”);
html(fieldData[row][cell]);
追加(newCell);
}
表.追加(新行);
}
返回表;
};
var updateField=函数(){
var field=createDomField(gameBoard.getField());
elem.fieldContainer.empty();
元素fieldContainer.append(字段)
}
在创建数组副本时,如上文所述,每次我更新/重画字段时,是否会导致内存泄漏(例如,如果我调用updateField无数次),或者在函数完成且DOM已更新时,重复的数组是否会被垃圾收集

如果它不是GC ed,有没有办法手动清理它

这是一种糟糕/丑陋的做法吗?
有没有更好的方法来公开数组的状态并在闭包中保持它的“私有”状态,这样就不能用dev tools/firebug对其进行操作?

一个想法是将
createBackingArray
公开,而不是
getField
您可以使用
populateField
updateField
重新使用它自己用
createBackingArray
创建的数组实例,只需用
populateField
重新获取数据即可


这里有一个例子:

。。。您是否试图阻止首先运行您所有JavaScript的客户端访问JavaScript堆的一部分,该部分是客户端RAM的一部分,由客户端上运行的JavaScript VM管理。。对老实说,我认为你失去了我。我想说的是,你不能阻止你的JS数据被开发工具/firebug操纵,你应该用你的时间做一些更有效率的事情。无论您做什么,您的代码都在客户机上运行,并且您的数据存储在客户机上。客户可以随心所欲地使用它。这并不是说没有其他理由不公开所有内容(有-封装是一种很好的设计)。按照它现在的工作方式(返回数组的副本),这是否至少在一定程度上保护了原始数组不受其他脚本/firebug的操纵?或者你在想什么更核心的操作方法,比如访问内存或其他什么?(不是为了争论,只是好奇)我这样做只是为了好玩,为了更好地学习JS,所以我认为尝试实现这一点至少有点效率(对我来说)=)Firebug:在一个“特权”函数中设置断点并处理内部变量是非常简单的。其他JS文件:不知道,可能更难,但我不会假设任何东西。你能详细说明一下吗,也许用一小段示例代码?我添加了一个示例链接。