JavaScript中for循环的内部和外部

时间:2018-10-23 04:36:32

标签: javascript

我是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

4 个答案:

答案 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)

由于Hoistinga在第一次循环时被重新分配给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