Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript,对于函数来说,var的行为似乎很奇怪_Javascript - Fatal编程技术网

javascript,对于函数来说,var的行为似乎很奇怪

javascript,对于函数来说,var的行为似乎很奇怪,javascript,Javascript,对于下面的代码,我得到未定义,进入循环,未定义,0,0,1,1,2。我明白为什么我只得到一个2(我想),但我很难理解为什么我得到两个0 “严格使用”; 控制台日志(消息); console.log(“进入循环”); 对于(变量i=0;i

对于下面的代码,我得到未定义,进入循环,未定义,0,0,1,1,2。我明白为什么我只得到一个2(我想),但我很难理解为什么我得到两个0

“严格使用”;
控制台日志(消息);
console.log(“进入循环”);
对于(变量i=0;i<3;i++){
控制台日志(消息);
var消息='编号:'+i;
控制台日志(消息);

}
在设置变量之前和之后都要进行日志记录
var
不会将变量限制在块中,因此旧值会保留。在第一次循环迭代中,您将获得

undefined
number: 0
number: 0
number: 1
number: 1
number: 2
在你得到的那一秒

undefined
number: 0
number: 0
number: 1
number: 1
number: 2
在最后一次迭代中,您将得到

undefined
number: 0
number: 0
number: 1
number: 1
number: 2
执行循环时:第一部分(
var i=0;
)在循环开始之前运行。第二部分(
i<3
)在每次迭代之前运行,以确定是否继续,第三部分(
i++
)在每次迭代之后运行。如果第二部分为truthy,则循环不会重新启动。这是你的循环展开

“严格使用”;
var消息;
console.log(消息);//“未定义”
console.log(“进入循环”);
var i=0;
//如果i<3,则循环i==0
console.log(消息);//“未定义”
消息='编号:'+i;
console.log(消息);//“编号:0”
i++;//i==1
//如果i<3,则循环i==1
console.log(消息);//“编号:0”
消息='编号:'+i;
console.log(消息);//“编号:1”
i++;//i==2
//如果i<3,则循环i==2
console.log(消息);//“编号:1”
消息='编号:'+i;
console.log(消息);//“号码:2”
i++;//i==3

//循环如果i<3,i==3
进入循环您的
编号
未定义

在循环中,它被设置为“Number=0”

再次进入循环
number
仍设置为“number=0”,并被“number=1”覆盖

再次进入循环
number
仍设置为“number=1”,并被“number=2”覆盖

再次进入循环i==3,因此循环结束


您可以用一支笔和一些纸轻松地完成此操作。

因此,在循环的第一次运行时,第一个console.log将是未定义的,因为消息尚未设置。然后发送消息=“编号:0”。在第二个循环中,消息仍然是“number:0”,因此,如果需要的话,你真的需要用笔和纸一步一步地完成。根据经验法则,使用++i而不是i++,你不会出错。@tinker-tailer这将如何改变这里的任何事情?@tinker-tailer不,这在这种情况下不会改变任何东西。我喜欢这样,但在展开的示例中,使用
console.log(message)上的注释可能值得一提在第一个
i++
之后,消息仍然等于
'number:0'
,因为它还没有被更新,即使
i
现在是
1
我对它进行了一些调整,以显示该变量被重用/提升并添加了日志注释。你认为@NickAYep这正是我所想的:)