我正在开发一个简单的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
};
}();
在另一个脚本中我有所有与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有办法以某种方式手动清理它吗?
这是一个糟糕/丑陋的方式吗? 是否有一种更好的方式来公开数组的状态,并且仍然在闭包中将其设置为“私有”,因此无法使用dev工具/ firebug进行操作?
答案 0 :(得分:0)
一个想法是公开createBackingArray
,而不是getField
您可以populateField
。 updateField
将重新使用自己使用createBackingArray
创建的数组实例,只需使用populateField
重新获取数据。
以下是一个示例:http://pastie.org/8266775