2016-11-30 79 views
1

我遵循蛇游戏教程。我将'snake_array.pop()'放在'paint()'函数的for循环中以查看会发生什么,并且我试图理解为什么会出现以下错误:JQuery for loop&array - 为什么这个变量未定义?

“Uncaught TypeError:无法读取属性'x'未定义“

我不明白为什么'x'是未定义的。 paint()for-loop的最后一次迭代使得c = snake_array [2],而snake_array [2]是{x:2,y:2}。那为什么它说x是不确定的?

$(document).ready(function(){ 
 
    
 
var canvas = $("#canvas")[0]; 
 
var ctx = canvas.getContext("2d"); 
 
var w = $("#canvas").width(); 
 
var h = $("#canvas").height(); 
 

 
ctx.fillStyle = "white"; 
 
ctx.fillRect(0, 0, w, h); 
 
ctx.strokStyle = "black"; 
 

 
var snake_array; 
 

 
create_snake(); 
 
function create_snake() 
 
{ 
 
    var length = 5; 
 
    snake_array = []; 
 
    for(var i = length - 1;i>=0;i--) 
 
    { 
 
     snake_array.push({x:i,y:2}); 
 
    } 
 
} 
 
    
 
function paint() 
 
{ 
 
    
 
    for(var i=0; i < snake_array.length; i++) 
 
    { 
 
     var tail = snake_array.pop(); 
 
    
 
\t \t \t var c = snake_array[i]; 
 
\t \t \t ctx.fillStyle = "blue"; 
 
\t \t \t ctx.fillRect(c.x*10, c.y*10, 10, 10); 
 
\t \t \t ctx.strokeStyle = "white"; 
 
\t \t \t ctx.strokeRect(c.x*10, c.y*10, 10, 10); 
 
     
 
    } 
 
} 
 
paint(); 
 
    
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<canvas id="canvas" width="450" height="450"></canvas>

+0

我要指出的一件事是,你从来没有使用变量尾 – hairmot

+0

你在哪里定义x和y作为变量?你是说w和h? – Jeff

+1

'snake_array.pop()'移除数组的最后一个元素。如果数组的长度在开头是1,那么你删除一个元素,并在尝试获取数组[0]后。但是数组[0]现在是未定义的。只需删除'var tail = snake_array.pop();'行即可 – Fefux

回答

1

当设置可变tail,要删除从数组的元素。这个数组在下一行被引用:var c = snake_array[i];

这意味着对于for循环的最后一次迭代,c引用索引为i的对象在一个空数组中!没有发现,因此未定义的错误。