以下是我在NodeJS的BattleShip尝试的MCVE。
Grid.set
调用Grid.place
,调用Grid.place.methodPlace
,试图呼叫Grid.cells
并失败。这不是访问此类变量的方法,因为this.cells
不在范围内。访问此变量的正确方法是什么?
我可能弄得一团糟。初学者就是这样做的。
"use strict";
function Grid(x, y) {
var r, c, row;
this.cells = [];
this.default = " ";
for(r = 0 ; r < x ; r++) {
row = [];
for(c = 0 ; c < y ; c++) {
row.push(" ");
}
this.cells.push(row);
}
}
Grid.prototype.place = function(length) {
function getRandomInt(min, max) {
return Math.floor(Math.random() * (max - min)) + min;
};
var coordinateList = [];
function methodPlace(indexOfMethodToUse) {
if (indexOfMethodToUse == 0) {
var rndX = getRandomInt(0,(9-length));
var rndY = getRandomInt(0,9)
for(var i = 0 ; i <= rndX + length ; i++) {
if (this.cells[rndX+i][rndY] == this.default) { // <=====
coordinateList.push(rndX+i,rndY);
}
};
}
console.log(coordinateList);
return coordinateList;
}
methodPlace(0);
};
Grid.prototype.set = function(ac) {
for(var i = 0 ; i <= ac ; i++) {
this.place(2);
}
}
var friendlyGrid = new Grid(10,10);
friendlyGrid.set(1,2,1,1);
答案 0 :(得分:2)
至少2个解决方案:
set()
和place()
如果您这样做,可以使用this.methodPlace(0)
进行调用,并且知道this
。.call()
注入上下文
如果您这样做,可以使用methodPlace.call(this, 0)
进行调用,并且知道this
。如果没有充分的理由让这个方法变得私有,我就把它公之于众:更可读,更清晰,更好的可调试性,更简单的语法等。如果它有充分的理由私人(访问),我使用.call()
还有另一个解决方案:
this
复制到self
并在内部使用
我不喜欢这样,因为self
和this
会浮动,但您可以将类/对象this
复制到self
并且在私有方法中使用self
代替this
(其中this
已更改):self
代替that
,这说明我不喜欢这样做了
var coordinateList = [];
var self = this;
function methodPlace(indexOfMethodToUse) {
// ... //
if (self.cells[rndX+i][rndY] == self.default) { // <=====
答案 1 :(得分:0)
Grid.prototype.place = function(length) {
var that = this;
// ... the rest of the code
然后,使用“that”而不是“this”。