2016-08-24 55 views
-5

在下面的代碼中,正在聲明horiz,然後在for循環中運行,該循環用空數組填充。同爲verti在第二線等是否"var"聲明僅適用於horiz(即分號打破了"var"聲明)或沒有的"var"宣言還初始化horizvertiherepathunvisited在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}; 
} 
+0

你是否運行這段代碼,看看變量有什麼值?不要跑到stackoverflow問這樣的問題。修改代碼。刪除逗號,添加分號或者反過來看看會發生什麼。你會從乾燥的答案中學到更多東西。 – Azamantes

+0

是的,我確實運行過代碼,而我想理解的是理論上的,它不能通過替換逗號和分號來解決 - 我已經這樣做了。我現在知道第一行是初始化「horiz」並運行for循環來填充「horiz」,第二行對「verti」等做同樣的事情。但現在我的問題是**是「var」僅應用於水平變量並在遇到分號時被破壞,或者初始化「垂直」,「這裏」,「路徑」和「未訪問」。 – a20

回答

1
var horiz =[]; //variable declaration 

for (var j= 0; j<x+1; j++) //for loop start 
    horiz[j]= [], verti =[]; //variable declaration 
//for loop end 


for (var j= 0; j<x+1; j++) //for loop start 
    verti[j]= [], here = [Math.floor(Math.random()*x), Math.floor(Math.random()*y)], path = [here], unvisited = []; //variable declaration 
//for loop end 

你可能會感到困惑,由於缺少括號

var horiz =[]; //variable declaration 

for (var j= 0; j<x+1; j++) { 
    horiz[j]= [], verti =[]; //variable declaration 
} 


for (var j= 0; j<x+1; j++) { 
    verti[j]= [], here = [Math.floor(Math.random()*x), Math.floor(Math.random()*y)], path = [here], unvisited = []; //variable declaration 
} 
+0

爲什麼使用var而不是「verti」定義「horiz」?爲什麼「verti」在第一個for循環內被多次初始化?爲什麼在這裏第二次循環會覆蓋「這裏」,「路徑」和「未訪問」這麼多次?我很抱歉,但我不認爲你是正確的......我一直在閱讀javascript的逗號運算符(但仍然感到困惑!),並且很快就會發布鏈接。 – a20

+0

@ a20考慮到這是代碼塊中的代碼片段,「var horiz = []」將horiz聲明爲空數組,「horiz [j] = []」將horiz的第j個元素聲明爲空數組,「verti = []」將verti聲明爲空數組(可能是全局的,如果沒有在代碼中聲明),「verti [j] = []」將verti的第j個元素聲明爲空數組,是一個有兩個元素的數組(可能是全局的,如果...代碼),「path = [here]」被聲明爲一個數組,其中第一個元素爲「here」(可能是全局的,如果...代碼),「unvisited = [ ]「正在聲明」未訪問「空數組(可能是全局的,如果...代碼) – Parth

+0

沒有其他全局聲明,這個」var ..「行是執行聲明的第一行。爲了清晰起見,我編輯了我的代碼以包含完整的代碼。你的回答根本沒有回答我的評論。我知道JavaScript,並沒有理由**初始化一個數組** ** for循環多次**。你的解釋是錯誤的。請閱讀我的第一條評論,並首先明白我想說的。 – a20

0

你的代碼中有幾個錯誤,你應該檢查你的控制檯看到它們。所以,你的變量沒有被聲明 - 只有horiz被聲明。 var horiz =[]之後的分號將結束其他變量的聲明。所以這個代碼:

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 = []; 

改成這樣:

var horiz = [], 
    verti = [], 
    here = [Math.floor(Math.random()*x), Math.floor(Math.random()*y)], 
    path = [here], 
    unvisited = []; 

for (var j = 0; j < x + 1; j++) { 
    horiz[j] = []; 
} 

for (var j = 0; j < x + 1; j++) { 
    verti[j] = []; 
} 

此外,我建議你使用大括號{ ... }更好的可讀性。

+0

不是我的代碼,更新了原來的帖子。所以我的假設是正確的,var只是初始化第一個變量。任何鏈接或理論來源來支持?我認爲最初編寫這個功能的人看起來相當先進,他/她也不會犯這麼明顯的錯誤。 – a20

+0

是的,你用'var'的假設是可以的。關於聲明變量,你可以在http://www.w3schools.com/js/js_variables.asp找到所有信息。我不知道,如果他/她在JS中擁有高級知識,但該網站上的聲明完全不正確,根本無法工作。 – Legionar