for (index1 = 1; index1 < 8; index1++) {
var op = '#';
for (index2 = index1; index2 - 1; index2--) {
op = op + '#';
}
console.log(op);
}
在上面的代码和语句“var op ='#';”中,每次在'for'迭代中定义和初始化变量'op',或者定义一次,并且每次使用特定值初始化.. < / p>
答案 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)
以下是您的代码段,它会在外部循环中的每次迭代中以递增值的形式记录#
:
for (index1 = 1; index1 < 8; index1++) {
var op = '#';
for (index2 = index1; index2 - 1; index2--) {
op = op + '#';
}
console.log(op);
}
&#13;
为了解释为什么会这样,首先,让我们剖析你的循环:
for (index1 = 1; index1 < 8; index1++) {
var op = '#';
. . .
在此部分中,您创建了一个值为op
的变量#
。对于7次迭代,它将被重新实例化为默认值#
。
但为什么变量会在每次迭代时递增?让我们进入内循环:
for (index2 = index1; index2 - 1; index2--) {
op = op + '#';
}
对于此内部循环内的每次迭代,您将额外的#
附加到默认值op
。
无论如何,让我们看看内循环对外循环的每次迭代进行了多少次迭代:
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;
如您所见,它为每个外循环迭代进行0, 1, 2, 3, 4, 5, 6
次迭代。意思是,在第一次迭代中,它不会附加#
,在第二次迭代上添加1 #
,依此类推。所以它证明了你的代码的结果。
#
##
###
####
#####
######
#######
旁注:注意到一些奇怪的东西?老实说,我发现这个循环非常奇怪。但是如果我是正确的,那是因为0是假的,因此它不会执行迭代,这是循环中的第二个参数。如果我的猜测是正确的,请添加评论。
无论如何,我想我必须将其作为一个问题发布。我收到question的回复后,我会更新此答案。
编辑:抱歉,console.log(x)
只有7次迭代。至于循环条件的怪异,我的猜测是正确的。 index2 - 1
也可以写为index2 - 1 != 0
或更准确!!(index2 - 1)
。 !!
将任何内容转换为布尔值。任何falsey值都将变为false:0
,null
,''
(空字符串),undefined
,{{1} }和NaN
。
关于你的问题(darn,我几乎忘记了奇怪的循环),让我们回到代码:
false
&#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。
如果您的代码let
和var
似乎没有对输出产生影响。
答案 3 :(得分:0)
var
variable创建在封闭函数的顶部,或者由于您在全局范围内,因此在脚本在全局范围内初始化时创建它。
在外部循环中,它基本上只是#
的赋值,覆盖了以前的任何值。
在内部循环中,它会在每次迭代时为该值附加另一个#
。
如果您使用let
variable而不是var
,那么变量将限定为外部循环的块,并且在该块外部不可访问,但仍可在内部循环内访问。
答案 4 :(得分:0)
“每次在'for'迭代中定义和初始化变量'op',或者每次定义一次并使用特定值初始化?”
op
变量在每个父循环迭代(for (index1 = 1; index1 < 8; index1++) {...}
)上再次创建,但对于每个子for
循环,它都存在,您只需从子循环覆盖其值。
答案 5 :(得分:0)