我是JS的新手,所以有人可以解释这个(在我看来)奇怪的行为(下面的代码)。第二个console.log将5打印到控制台,尽管事实上循环定义a应该小于5。第二个console.log在循环之外。我知道将值赋给“ let”而不是“ var”会产生不同的结果,但是我很好奇JS为什么如此行事。 JS是否会以某种方式“导出”该5到循环之外?我有点困惑。
var a = 10;
for (var a=0; a<5; a++) {
console.log ("Number inside is " + a);
}; //Prints: "Number inside is 0...1...2...3...4"
console.log ("Number outside is " + a);
//Prints: "Number outside is 5
答案 0 :(得分:0)
a++
在执行后将变量a
加1。
console.log
内部循环一直执行到a
的值小于5为止。但是,在最后一次循环迭代之后,a
的值变为4并由内部{{1}打印},console.log
将其值增加到5,然后for循环条件a++
失败并中断循环。然后,编译器在for循环之外执行a<5
,其中console.log
的值已经为5。
关键是,仅当a
的值变为5时,for循环才会中断。但是,一旦中断,循环内的a
就不会执行,编译器将执行代码行在for循环旁边。
此外,您已经在循环外声明了变量console.log
,并且即使循环结束了,变量的范围也存在。
希望它可以澄清混乱情况。
答案 1 :(得分:0)
用var
声明的变量的范围是其当前的执行上下文,它是封装函数,或者对于在任何函数之外声明的变量,global
。
此处将变量a
声明为globally
,然后重新声明该变量以使其original value changed
,
因此,在for循环内运行时,首先将a初始化为0,从而替换为10,而当循环在a处终止时,其等于5,因为5 <5,这是错误的。
因此将值5合并到外部for循环中。
因此,得出的结论是var
的作用域是负责变化的。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/var
答案 2 :(得分:0)
当条件结束后,循环console.log ("Number inside is " + a);
将打印0、1、2、3、4,在此循环之外,将打印5个循环结束,但余值保留在范围内并打印5。
如果您使用let,它将给出10,因为您已在循环上方声明了变量var a=10
。
答案 3 :(得分:-1)
由于Hoisting,a
在第一次循环时被重新分配给0
,而不是声明新变量。这是浏览器执行代码的方式:
var a = 10;
for (a = 0; a < 5; a++) {
console.log ("Number inside is " + a);
}; //Prints: "Number inside is 0...1...2...3...4"
console.log ("Number outside is " + a);
//Prints: "Number outside is 5