2016-08-24 36 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