在下面的代碼中,正在聲明horiz
,然後在for循環中運行,該循環用空數組填充。同爲verti
在第二線等是否"var"
聲明僅適用於horiz
(即分號打破了"var"
聲明)或沒有的"var"
宣言還初始化horiz
,verti
,here
,path
和unvisited
?在javascript變量聲明中混合逗號和分號的效果
var horiz =[]; for (var j= 0; j<x+1; j++) horiz[j]= [],
verti =[]; for (var j= 0; j<x+1; j++) verti[j]= [],
here = [Math.floor(Math.random()*x), Math.floor(Math.random()*y)],
path = [here],
unvisited = [];
編輯:此處爲清晰起見添加了完整功能。函數中的變量不是全局變量,或者正在函數外部初始化。
編輯2:代碼是從這裏開始:http://rosettacode.org/wiki/Maze_generation#JavaScript
function maze(x,y) {
var n=x*y-1;
if (n<0) {alert("illegal maze dimensions");return;}
var horiz =[]; for (var j= 0; j<x+1; j++) horiz[j]= [],
verti =[]; for (var j= 0; j<x+1; j++) verti[j]= [],
here = [Math.floor(Math.random()*x), Math.floor(Math.random()*y)],
path = [here],
unvisited = [];
for (var j = 0; j<x+2; j++) {
unvisited[j] = [];
for (var k= 0; k<y+1; k++)
unvisited[j].push(j>0 && j<x+1 && k>0 && (j != here[0]+1 || k != here[1]+1));
}
while (0<n) {
var potential = [[here[0]+1, here[1]], [here[0],here[1]+1],
[here[0]-1, here[1]], [here[0],here[1]-1]];
var neighbors = [];
for (var j = 0; j < 4; j++)
if (unvisited[potential[j][0]+1][potential[j][1]+1])
neighbors.push(potential[j]);
if (neighbors.length) {
n = n-1;
next= neighbors[Math.floor(Math.random()*neighbors.length)];
unvisited[next[0]+1][next[1]+1]= false;
if (next[0] == here[0])
horiz[next[0]][(next[1]+here[1]-1)/2]= true;
else
verti[(next[0]+here[0]-1)/2][next[1]]= true;
path.push(here = next);
} else
here = path.pop();
}
return {x: x, y: y, horiz: horiz, verti: verti};
}
你是否運行這段代碼,看看變量有什麼值?不要跑到stackoverflow問這樣的問題。修改代碼。刪除逗號,添加分號或者反過來看看會發生什麼。你會從乾燥的答案中學到更多東西。 – Azamantes
是的,我確實運行過代碼,而我想理解的是理論上的,它不能通過替換逗號和分號來解決 - 我已經這樣做了。我現在知道第一行是初始化「horiz」並運行for循環來填充「horiz」,第二行對「verti」等做同樣的事情。但現在我的問題是**是「var」僅應用於水平變量並在遇到分號時被破壞,或者初始化「垂直」,「這裏」,「路徑」和「未訪問」。 – a20