Node.JS

时间:2015-05-30 12:53:10

标签: node.js scope

以下是我在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);

2 个答案:

答案 0 :(得分:2)

至少2个解决方案:

  1. 将该方法设为公开,例如set()place() 如果您这样做,可以使用this.methodPlace(0)进行调用,并且知道this
  2. 使用.call()注入上下文 如果您这样做,可以使用methodPlace.call(this, 0)进行调用,并且知道this
  3. 如果没有充分的理由让这个方法变得私有,我就把它公之于众:更可读,更清晰,更好的可调试性,更简单的语法等。如果它有充分的理由私人(访问),我使用.call()

    还有另一个解决方案:

    1. this复制到self并在内部使用 我不喜欢这样,因为selfthis会浮动,但您可以将类/对象this复制到self并且在私有方法中使用self代替this(其中this已更改):
      (这是panta82的解决方案,但使用self代替that,这说明我不喜欢这样做了
    2. 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”。