2016-08-24 1 views
-5

아래 코드에서 horiz이 선언되고 빈 루프로 채워지는 for 루프를 통해 실행됩니다. "var" 선언은 horiz 적용됩니까 두 번째 라인 등의 verti에 대한 동일 (즉 세미콜론은 "var" 선언을 나누기) 또는 "var" 선언은 horiz, verti, here, pathunvisited을 초기화합니까?자바 스크립트 변수 선언에서 쉼표와 세미콜론을 섞는 효과

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"를 초기화하고 "horiz"를 채우기 위해 for 루프를 실행한다는 것을 알고 있습니다. 두 번째 줄은 "verti"등에 대해 동일한 작업을 수행하고 있습니다. 그러나 이제는 나를위한 질문이 ** "var" horiz 변수에만 적용되고 세미콜론과 마주 치거나 "verti", "here", "path"및 "unvisited"로 초기화됩니다. – 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

"horiz"가 var가 아닌 "verti"로 정의 된 이유는 무엇입니까? "verti"가 첫 번째 for 루프 내부에서 여러 번 초기화되는 이유는 무엇입니까? 두 번째 루프에서 "여기", "경로"및 "비공개"가 여러 번 덮어 쓰여지는 이유는 무엇입니까? 미안하지만 당신이 옳다고 나는 생각하지 않는다 ... 나는 자바 스크립트를 위해 콤마 연산자를 읽고있다. (그러나 여전히 혼란 스럽다!) 곧 링크를 게시 할 것이다. – a20

+0

@ a20 이것은 코드 블록의 코드 스 니펫으로, "var horiz = []"는 horiz를 빈 배열로 선언하고 있습니다. "horiz [j] = []"는 horiz의 j 번째 요소를 빈 배열로 선언합니다 , "verti = []"는 verti를 빈 배열로 선언하고 있습니다 (코드에서 앞에서 선언하지 않으면 전역 일 수 있음). "verti [j] = []"는 verti의 j 번째 요소를 빈 배열로 선언합니다. 두 번째 요소가있는 배열입니다 (코드가 ... 인 경우 전역). "path = [here]"는 첫 번째 요소가 "여기"인 배열로 선언됩니다 (코드의 경우 전역 일 수 있음). "unvisited = ] "은"unvisited "빈 배열을 선언하고 있습니다 (아마도 전역 ... 코드) – Parth

+0

다른 전역 선언이 없으면이"var .. "행은 선언을 수행하는 첫 번째 행입니다. 명확성을 위해 전체 코드를 포함하도록 코드를 편집했습니다. 귀하의 회신은 내 의견에 전혀 대답하지 않았습니다. 나는 자바 스크립트를 알고 있으며 ** 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

관련 문제