多个for循环,无支架

时间:2017-04-10 15:44:12

标签: javascript syntax

我正在查看以下代码,其中for循环没有括号。我很难弄清楚它应该如何运作。我来自C#,Java和一些C ++的背景。所有这些语言都比关于括号使用的javascript更严格。

function StupidMesh(volume, dims) {
  var vertices = [], faces = [], x = [0,0,0], n = 0;
  for(x[2]=0; x[2]<dims[2]; ++x[2])
  for(x[1]=0; x[1]<dims[1]; ++x[1])
  for(x[0]=0; x[0]<dims[0]; ++x[0], ++n)
  if(!!volume[n]) {
    for(var d=0; d<3; ++d) {
      var t = [x[0], x[1], x[2]]
        , u = [0,0,0]
        , v = [0,0,0];
      u[(d+1)%3] = 1;
      v[(d+2)%3] = 1;
      for(var s=0; s<2; ++s) {
        t[d] = x[d] + s;
        var tmp = u;
        u = v;
        v = tmp;
        var vertex_count = vertices.length;
        vertices.push([t[0],           t[1],           t[2]          ]);
        vertices.push([t[0]+u[0],      t[1]+u[1],      t[2]+u[2]     ]);
        vertices.push([t[0]+u[0]+v[0], t[1]+u[1]+v[1], t[2]+u[2]+v[2]]);
        vertices.push([t[0]     +v[0], t[1]     +v[1], t[2]     +v[2]]);
        faces.push([vertex_count, vertex_count+1, vertex_count+2, vertex_count+3, volume[n]]);
      }
    }
  }
  return { vertices:vertices, faces:faces };
}

2 个答案:

答案 0 :(得分:2)

如果loopif block只有一个语句,我们可以随时删除括号。

所以解释下面的代码:

for (x[2] = 0; x[2] < dims[2]; ++x[2]) //There will be only one statement which is the next for loop
  for (x[1] = 0; x[1] < dims[1]; ++x[1])  //There will be only one statement which is the next for loop
    for (x[0] = 0; x[0] < dims[0]; ++x[0], ++n) //There will be only one statement which is the if statement
      if (!!volume[n]) { //There will be multiple statements, so we use brackets
        for (var d = 0; d < 3; ++d) {
          var t = [x[0], x[1], x[2]],
            u = [0, 0, 0],
            v = [0, 0, 0];
          u[(d + 1) % 3] = 1;
          v[(d + 2) % 3] = 1;
          for (var s = 0; s < 2; ++s) {
            t[d] = x[d] + s;
            var tmp = u;
            u = v;
            v = tmp;
            var vertex_count = vertices.length;
            vertices.push([t[0], t[1], t[2]]);
            vertices.push([t[0] + u[0], t[1] + u[1], t[2] + u[2]]);
            vertices.push([t[0] + u[0] + v[0], t[1] + u[1] + v[1], t[2] + u[2] + v[2]]);
            vertices.push([t[0] + v[0], t[1] + v[1], t[2] + v[2]]);
            faces.push([vertex_count, vertex_count + 1, vertex_count + 2, vertex_count + 3, volume[n]]);
          }
        }
      }

这是因为每个forif块在这里被视为一行语句。

答案 1 :(得分:0)

语法如下:

while (expression) do statement

语句必须简单,但如果要执行多个语句,则应使用花括号:{}。在这种情况下,语句被组合在一起,从语法的角度来看,它们被视为一个语句:

while (smthIsTrue) {
    console.log("hi!");
    console.log("there're many statements grouped with {}");
}

对于......甚至if-statement:

这样的陈述也是如此
if (smthIsTrue) {
    statement1;
    statement2;
    ...
    statementN;
}

我建议您仔细选择使用或不使用{}的时间和原因。当您明确使用{}时,可以避免一些错误。 看:

if (smthIsTrue)
    sayHello();
informUsers();

informUsers();无论如何都会运行,即使你假设它运行如果smthIsTrue == true。为什么?没有花括号,只执行下一个语句:sayHello();

以下代码也适用! if(expression) ;

;

这是一个空语句,所以js看起来是正确的。但是,其他人如何理解你是犯了错误还是特意将这段代码放在某个地方?最好的方法是评论这样一个地方,以便没有任何其他方式来理解代码:

if (youCanDoNothing) /* There shouldn't be anything, please dont' treat it as a mistake */;

以这种方式,如果你在编写代码后的某段时间内查看代码,你就没有机会忘记你特意提到了某些代码。