Javascript 函数未被识别为函数?

Javascript 函数未被识别为函数?,javascript,constructor,p5.js,Javascript,Constructor,P5.js,我现在处境艰难。我不知道我在做什么!不管怎样,我正在为我的蛇游戏制作一张地图。目前,我正试图添加一个墙,但它不会工作!代码如下: 或写下: wallCount = 0 var walls = [] walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]) wall

我现在处境艰难。我不知道我在做什么!不管怎样,我正在为我的蛇游戏制作一张地图。目前,我正试图添加一个墙,但它不会工作!代码如下:

或写下:

wallCount = 0
var walls = []
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
walls.push([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
function setup() {
  createCanvas(400, 400);

  for (let i = 0; i < 20; i++){
    for (let j = 0 ; j < 20 ; j++){
      if (walls[i][j] == 1){
        walls[i][j] = new Wall(walls[i]*20, walls[j]*20);
        wallCount = wallCount + 1
      }
      }
}
}

function Wall(x, y){
  this.x = x;
  this.y = y;
  rect(this.x, this.y, 20, 20);

  this.display = function(){
  fill(255, 255, 0);
  rect(this.x, this.y, 20, 20);
  }
}

function draw() {

  background(0);
  for (let i = 0 ; i < wallCount ; i++){
    for (let j = 0 ; j < wallCount ; j++){
    walls[i][j].display();
  }
  }

}
我收到一个错误TypeError:walls[I][j]。显示不是函数草图:第52行

我不知道从哪里开始。我尝试了很多东西,但这就像我在黑暗中射击一样。有人知道怎么了吗?
/Jens

您只是在初始化数组中1的位置,但您的代码希望整个2D数组包含Wall的实例

在不了解您正在做什么的情况下,您需要检查每个对象是否都是墙的实例

if (walls[i][j] instanceof Wall) {
  walls[i][j].display();
}

您只是在初始化数组中1所在的点,但代码希望整个二维数组包含墙的实例

在不了解您正在做什么的情况下,您需要检查每个对象是否都是墙的实例

if (walls[i][j] instanceof Wall) {
  walls[i][j].display();
}

问题是,您试图从墙数组中获取墙,该数组也包含零。根据您的设计,第一面墙不保证位于[0][0]

您可以仅为墙创建单独的阵列:

var wallList = [];
var walls = [];

function setup() {
  createCanvas(400, 400);

  for (let i = 0; i < walls.length; i++) {
    for (let j = 0; j < walls.length; j++) {
      if (walls[i][j] == 1) {
        walls[i][j] = new Wall(walls[i] * 20, walls[j] * 20);
        wallList.push(walls[i][j]);
      }
    }
  }
}

function Wall(x, y) {
  this.x = x;
  this.y = y;
  rect(this.x, this.y, 20, 20);

  this.display = function() {
    fill(255, 255, 0);
    rect(this.x, this.y, 20, 20);
  }
}

function draw() {
  background(0);
  for (let i = 0; i < wallList.length; i++) {
    wallList[i][j].display();
  }
}
或者,在继续之前,应检查所有项目的循环,并检查每个项目是否为墙:

var walls = [];

function setup() {
  createCanvas(400, 400);

  for (let i = 0; i < walls.length; i++) {
    for (let j = 0; j < walls.length; j++) {
      if (walls[i][j] == 1) {
        walls[i][j] = new Wall(walls[i] * 20, walls[j] * 20);
      }
    }
  }
}

function Wall(x, y) {
  this.x = x;
  this.y = y;
  rect(this.x, this.y, 20, 20);

  this.display = function() {
    fill(255, 255, 0);
    rect(this.x, this.y, 20, 20);
  }
}

function draw() {
  background(0);
  for (let i = 0; i < walls.length; i++) {
    for (let j = 0; j < walls.length; j++) {
      if(walls[i][j] instanceof Wall) walls[i][j].display();
    }
  }
}

问题是,您试图从墙数组中获取墙,该数组也包含零。根据您的设计,第一面墙不保证位于[0][0]

您可以仅为墙创建单独的阵列:

var wallList = [];
var walls = [];

function setup() {
  createCanvas(400, 400);

  for (let i = 0; i < walls.length; i++) {
    for (let j = 0; j < walls.length; j++) {
      if (walls[i][j] == 1) {
        walls[i][j] = new Wall(walls[i] * 20, walls[j] * 20);
        wallList.push(walls[i][j]);
      }
    }
  }
}

function Wall(x, y) {
  this.x = x;
  this.y = y;
  rect(this.x, this.y, 20, 20);

  this.display = function() {
    fill(255, 255, 0);
    rect(this.x, this.y, 20, 20);
  }
}

function draw() {
  background(0);
  for (let i = 0; i < wallList.length; i++) {
    wallList[i][j].display();
  }
}
或者,在继续之前,应检查所有项目的循环,并检查每个项目是否为墙:

var walls = [];

function setup() {
  createCanvas(400, 400);

  for (let i = 0; i < walls.length; i++) {
    for (let j = 0; j < walls.length; j++) {
      if (walls[i][j] == 1) {
        walls[i][j] = new Wall(walls[i] * 20, walls[j] * 20);
      }
    }
  }
}

function Wall(x, y) {
  this.x = x;
  this.y = y;
  rect(this.x, this.y, 20, 20);

  this.display = function() {
    fill(255, 255, 0);
    rect(this.x, this.y, 20, 20);
  }
}

function draw() {
  background(0);
  for (let i = 0; i < walls.length; i++) {
    for (let j = 0; j < walls.length; j++) {
      if(walls[i][j] instanceof Wall) walls[i][j].display();
    }
  }
}

这不是你问题的解决办法,而是你应该做的事情。重构此函数

function Wall(x, y){
  this.x = x;
  this.y = y;
  rect(this.x, this.y, 20, 20);

  this.display = function(){
  fill(255, 255, 0);
  rect(this.x, this.y, 20, 20);
  }
}
进入


在您的原始代码中,对Wall构造函数的avery调用将创建一个新的独立函数,尽管它与其他每一个显示函数相同,但从性能角度来看,这是很糟糕的。改用函数原型。

不是问题的解决方案,而是您应该做的事情。重构此函数

function Wall(x, y){
  this.x = x;
  this.y = y;
  rect(this.x, this.y, 20, 20);

  this.display = function(){
  fill(255, 255, 0);
  rect(this.x, this.y, 20, 20);
  }
}
进入



在您的原始代码中,对Wall构造函数的avery调用将创建一个新的独立函数,尽管它与其他每一个显示函数相同,但从性能角度来看,这是很糟糕的。改用函数原型。

walls[i][j]。display不是一个函数,这意味着索引之一不存在。检查墙[i]是否存在或检查墙[i][j]是否存在。是的,确实如此。我在上面提到过一个例子,它可以抛出这个错误。我明白了,您正在尝试访问不存在的数组函数显示。@詹姆斯:不,OP没有尝试访问数组函数。这对我来说太新了。我不是在Wall函数中声明display函数吗?@Jens看我的答案,这里有一个明确的解释walls[I][j]。display不是一个函数,这意味着索引中的函数不存在。检查墙[i]是否存在或检查墙[i][j]是否存在。是的,确实如此。我在上面提到过一个例子,它可以抛出这个错误。我明白了,您正在尝试访问不存在的数组函数显示。@詹姆斯:不,OP没有尝试访问数组函数。这对我来说太新了。我不是在墙函数中声明了显示函数吗?@Jens看到我的答案,有一个明确的解释,真正的问题隐藏在你的答案中,而你从来没有解释过。你应该努力先解释问题,然后再提出任何改进建议。这里有一个改进建议,当代码的其余部分避免无括号的if时,你也应该这样做。但是你选择发布它,因为你看到我已经用基本相同的东西回答了它?嗨,尼克!谢谢你的回答!为等于1的数组单独设置一个数组是一个很好的解决方案!但我想我会选择instanceof解决方案。这仍然是一个很好的解决方案@JuanMendes不,我总是发布一个基本答案,然后再做更多的工作。你的基本答案有很多代码@Jens这个答案也提到了一个例子,它只是隐藏在所有的代码中。真正的问题隐藏在你的答案中,而你从来没有解释过。你应该努力先解释问题,然后再提出任何改进建议。这里有一个改进建议,当代码的其余部分避免无括号的if时,你也应该这样做。但是你选择发布它,因为你看到我已经用基本相同的东西回答了它?嗨,尼克!谢谢你的回答!为等于1的数组单独设置一个数组是一个很好的解决方案!但我想我会选择instanceof解决方案。这仍然是一个很好的解决方案@JuanMendes不,我总是发布一个基本答案,然后再做更多的工作。你的基本答案有很多代码@Jens这个答案也提到了instanceof,它只是隐藏在所有的代码中谢谢你!我刚刚开始学习构造函数,它非常新而且令人困惑。instanceof是一个新的
对我来说很重要!这正是我要找的!非常感谢你!我刚刚开始学习构造函数,它非常新而且令人困惑。瞬间对我来说是件新鲜事!这正是我要找的!直接在原型上的函数不需要查找原型链,因此由OP决定他们是否喜欢快速访问而不是稍微多一些内存。你应该发布一个而不是一个答案。直接在原型上的函数不需要查找原型链,因此由OP决定他们是否喜欢快速访问而不是稍微多一些内存。你应该贴一个而不是一个答案。