迭代期间变量的范围/寿命

时间:2017-10-07 14:22:44

标签: javascript

for (index1 = 1; index1 < 8; index1++) {
  var op = '#';
  for (index2 = index1; index2 - 1; index2--) {
    op = op + '#';

  }
  console.log(op);
}

在上面的代码和语句“var op ='#';”中,每次在'for'迭代中定义和初始化变量'op',或者定义一次,并且每次使用特定值初始化.. < / p>

6 个答案:

答案 0 :(得分:5)

由于variable hoisting,您的代码与以下代码段相同。这意味着op被声明一次,但在外循环的每次迭代中都被初始化为#

var op;
for(index1 = 1 ;index1<8;index1++)
{
    op = '#'; 
    for (index2 = index1; index2-1; index2--) 
    {
        op = op + '#';

    }
    console.log(op);
}

答案 1 :(得分:1)

以下是您的代码段,它会在外部循环中的每次迭代中以递增值的形式记录#

&#13;
&#13;
for (index1 = 1; index1 < 8; index1++) {
  var op = '#';
  for (index2 = index1; index2 - 1; index2--) {
    op = op + '#';
  }
  console.log(op);
}
&#13;
&#13;
&#13;

为了解释为什么会这样,首先,让我们剖析你的循环:

for (index1 = 1; index1 < 8; index1++) {
  var op = '#';
. . . 

在此部分中,您创建了一个值为op的变量#。对于7次迭代,它将被重新实例化为默认值#

但为什么变量会在每次迭代时递增?让我们进入内循环:

for (index2 = index1; index2 - 1; index2--) {
    op = op + '#';
}

对于此内部循环内的每次迭代,您将额外的#附加到默认值op

无论如何,让我们看看内循环对外循环的每次迭代进行了多少次迭代:

&#13;
&#13;
var x = 0;

for (index1 = 1; index1 < 8; index1++) {
  //var op = '#';
  for (index2 = index1; index2 - 1; index2--) {
    //op = op + '#';
    x++;
  }
  console.log(x);
  x = 0;
  //console.log(op);
}
&#13;
&#13;
&#13;

如您所见,它为每个外循环迭代进行0, 1, 2, 3, 4, 5, 6次迭代。意思是,在第一次迭代中,它不会附加#,在第二次迭代上添加1 #,依此类推。所以它证明了你的代码的结果。

#
##
###
####
#####
######
#######

旁注:注意到一些奇怪的东西?老实说,我发现这个循环非常奇怪。但是如果我是正确的,那是因为0是假的,因此它不会执行迭代,这是循环中的第二个参数。如果我的猜测是正确的,请添加评论。

无论如何,我想我必须将其作为一个问题发布。我收到question的回复后,我会更新此答案。

编辑:抱歉,console.log(x)只有7次迭代。至于循环条件的怪异,我的猜测是正确的。 index2 - 1也可以写为index2 - 1 != 0或更准确!!(index2 - 1)!!将任何内容转换为布尔值。任何falsey值都将变为false:0null''空字符串),undefined,{{1} }和NaN

关于你的问题(darn,我几乎忘记了奇怪的循环),让我们回到代码:

&#13;
&#13;
false
&#13;
&#13;
&#13;

TADA!它仍会记录for (index1 = 1; index1 < 8; index1++) { var op = '#'; for (index2 = index1; index2 - 1; index2--) { op = op + '#'; } //console.log(op); } //let's see if the variable resides outside the outer loop console.log(op);。这是因为@Cristy所说的可变提升。

答案 2 :(得分:0)

变量的范围将是函数范围,因为您使用的是var

因此编译器/解释器将通过一个名为hoisting的过程将此变量移动到函数的开头。

如果您想要块范围,请使用let代替var。

如果您的代码letvar似乎没有对输出产生影响。

答案 3 :(得分:0)

var variable创建在封闭函数的顶部,或者由于您在全局范围内,因此在脚本在全局范围内初始化时创建它。

在外部循环中,它基本上只是#的赋值,覆盖了以前的任何值。

在内部循环中,它会在每次迭代时为该值附加另一个#

如果您使用let variable而不是var,那么变量将限定为外部循环的块,并且在该块外部不可访问,但仍可在内部循环内访问。

答案 4 :(得分:0)

“每次在'for'迭代中定义和初始化变量'op',或者每次定义一次并使用特定值初始化?”

op变量在每个父循环迭代(for (index1 = 1; index1 < 8; index1++) {...})上再次创建,但对于每个子for循环,它都存在,您只需从子循环覆盖其值。

答案 5 :(得分:0)

“每次都定义和初始化变量'op'”

没有。

“var”是解析器的指令,而不是在运行时执行的命令。将值声明为循环内部,循环外部或两者都没有区别。

请参阅this post

我认为如果变量是在循环之外声明的,那么可读性会更好。

这是一个 scope 问题