2016-11-17 31 views
-1

我一直收到错误无法设置在create2DArray undefined属性'0'。无法访问我的数组

介意解释这里的逻辑有什么问题?我知道这是一个新人的错误,因为我还没有掌握阵列。

const ROW = 10; 
const COL = 11; 
const SIZE = 64; 

var canvas = document.getElementById("canvas"); 
var surface = canvas.getContext("2d"); 
const image = new Image(); 
image.src = "box_image.png"; 

//creating a tile 
function Box() { 
    this.xaxis = 0; 
    this.yaxis = 0; 
    this.img = image; 
} 

create2DArray(); 

//creating map 
var map = []; 

function create2DArray() { 
    for (var i=0; i < ROW; i++){ 
     map[i] = []; 
     for (var j=0; j<COL; j++){ 
      map[i][j] = new Box(); 
     } 
    } 
} 
+8

你调用'create2DArray()'** **前初始化'map'。 – Pointy

+0

作为@Pointy的后续,这可能发生,因为你的函数正在操作一个全局变量,它应该作为参数给予,所以重写'function created2DArray(map){...}',你会合理地不再次击中它(当你这样做的时候,错误会更加明显)。如果一个函数需要操纵某个事物,那么就把它传递给它。不要相信它存在于更高的范围内。 –

+1

你的代码基本上是'var map = undefined; create2DArray(); map = [];' – epascarello

回答

0

你应该知道这里的变量提升。

您声明map的方式,它在create2DArray调用之后声明并初始化。

这里有两个锁扣被声明并在函数的任何位置定义

  1. 变量,他们得到提升到函数的顶部,有声明,而不是初始化。 在你的情况下,只有var map;被吊起,但不VAR地图= []

  2. 功能始终得不到不管他们在哪里delcared,因此,即使方法声明为末悬挂,你仍然可以调用。 但是,当你有一个函数表达式时,如果你有这样的事情,你会遇到同样的问题,因为没有定义createArray。

    var create2DArray = function() { 
        for (var i = 0; i < ROW; i++) { 
         map[i] = []; 
         for (var j = 0; j < COL; j++) { 
          map[i][j] = new Box(); 
         } 
        } 
    } 
    

const ROW = 10; 
 
const COL = 11; 
 
const SIZE = 64; 
 

 
var canvas = document.getElementById("canvas"); 
 
var surface = canvas.getContext("2d"); 
 
const image = new Image(); 
 
image.src = "box_image.png"; 
 

 
//creating a tile 
 
function Box() { 
 
    this.xaxis = 0; 
 
    this.yaxis = 0; 
 
    this.img = image; 
 
} 
 

 
var map = []; 
 

 
create2DArray(); 
 

 
//creating map 
 

 

 
function create2DArray() { 
 
    for (var i = 0; i < ROW; i++) { 
 
    console.log("Creating Box", i); 
 
    map[i] = []; 
 
    for (var j = 0; j < COL; j++) { 
 
     
 
     map[i][j] = new Box(); 
 
    } 
 
    } 
 
}
<canvas id="canvas"></canvas>

更多Variable and Function hoisting