在闭包中公开数组的状态,而不允许从外部对其进行编辑
Exposing state of array in a closure without allowing it to be edited from the outside
我正在开发一个简单的井字游戏,其中我有一个代表比赛场地并包含游戏逻辑的揭示模块,而无需了解 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
你可以populateField
。 updateField
将重用它自己用createBackingArray
创建的数组实例,而只是用populateField
重新获取数据。
下面是一个示例:http://pastie.org/8266775
相关文章:
- GWT:可以从外部JavaScript而不是JSNI调用Java方法吗
- 方法不允许 — 从 Angularjs 中的请求标头中删除 Access-Control-Request-Method
- 是否可以从外部样式表中获取 dom 元素的特定 css 属性的值,而不是从计算的样式表中获取
- 从外部域 javascript 保存的本地存储不会保存在外部域下
- 为什么允许“src”属性链接到来自外部域的脚本,而 XmlHtppRequests 则不允许
- JSON文件从URL中出现得很好,但不允许我用$.getJSON(JS)抓取它
- BootStrap 3 上的导航栏间谍不允许外部链接
- Casperjs赢得'不允许使用外部模块
- 在闭包中公开数组的状态,而不允许从外部对其进行编辑
- ajax调用不会从外部JS文件返回数据
- 从外部文件加载html而不丢失<脚本>标签
- (方法不允许)外部xml到json
- 在不刷新视频的情况下,从外部源调整正在运行的flash视频的大小
- jQuery:$.ajax 成功回调不允许我分配给外部私有变量
- Processing.js没有'不允许在firefox中绑定外部javascript
- 为什么我不能从外部访问我的javascript构造函数
- 当使用基于IE JS/CSS(YUI)的UI从外部网络访问网站时,工作不正常
- JQuery自动完成将不允许从下拉IE中进行选择
- 当从外部方法调用时,RaphaelJS的animate不起作用
- strutsaction属性不能从外部javaScript访问