Javascript 在闭包中公开数组的状态,而不允许从外部对其进行编辑
我正在开发一个简单的Tic-Tac-Toe游戏,其中有一个显示模块,表示游戏场,包含游戏逻辑,而不知道DOM: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);
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文件:不知道,可能更难,但我不会假设任何东西。你能详细说明一下吗,也许用一小段示例代码?我添加了一个示例链接。