这个意外的输出是怎么来的?

时间:2019-02-01 16:19:38

标签: javascript

console.log(i);
    for(var i=0;i<2;i++){
          console.log(i);
    }

这显示了浏览器中的某些意外输出。谁能解释一下? 输出为:

Output

在不同的控制台上,它实际上有很大的不同。 Mozilla文档说:

  

// myVarVariable 在此处可见

     

for(var myVarVariable = 0; myVarVariable <5; myVarVariable ++){
  // myVarVariable对整个函数可见}

     

// myVarVariable 在此处可见

5 个答案:

答案 0 :(得分:2)

这是由于吊装引起的。在javascript中,用var声明的变量显示提升。提升是将所有变量声明置于Java脚本作用域顶部的过程。但是请注意,它们未分配以下代码中分配的值。 letconst没有显示此行为

console.log(x);
var x = 4;
console.log(y)
let y = 4

答案 1 :(得分:2)

您的代码中没有unexpected,它的表现应有尽有。

console.log(i);

由于在JavaScript中称为hoisting的概念,此日志语句将打印undefined。当您使用var关键字定义变量时,在运行javascript时,它们会被移动/提升到功能/本地范围的顶部。

现在您可能会问,如果将变量声明移至/悬挂在功能/本地作用域的顶部,那么为什么记录i会显示undefined?这是因为只有变量声明位于顶部,而不是变量的值。因此,当您在循环之前登录i时,它会为您提供undefined,因为Javascript识别出变量i在此作用域中存在,但尚未赋值。

for loop内部,变量i初始化为值0,然后循环执行两次,并给您01

现在您还可以在i之后访问变量for loop,这是因为var功能范围。这意味着如果没有在任何函数中定义,则用关键字var定义的变量将全局可用。

如果您不希望出现这种情况,请使用let而不是varlet关键字提供块级作用域,这意味着使用let关键字定义的变量仅在定义它们的块(大括号之间)可用。

答案 2 :(得分:1)

将变量声明为with names as ( select prod_cat_nm , prod_cat_nm+group as new_nm from (query that joins 3 tables together) as qry join (Select prod_cat_nm, count(distinct group) from (query that joins 3 tables together) as x group by prod_cat_nm having count(distinct group) > 1) dups on dups.prod_cat_nm = qry.prod_cat_nm ) SELECT prod_cat_nm, STRING_AGG(New_nm, '') WITHIN GROUP (ORDER BY New_Nm ASC) AS new_prod_cat_nm FROM names GROUP BY prod_cat_nm; ,那样就不会发生。还要检查this

答案 3 :(得分:1)

由于variable hoistingvar声明实际上被移到其执行上下文范围的顶部(在本例中为全局范围)。因此,您的代码与以下代码相同:

var i;
console.log(i);
for(i=0;i<2;i++){
    console.log(i);
}

答案 4 :(得分:0)

在javascript内部循环中,使用ler代替var ...然后您甚至可以对变量使用相同的名称并获得不同的结果。下面的示例:

var x = 1;
  if (true) {
    var x = 2;  // same variable
    console.log(x);  // 2
   }
   console.log(x);  // 2
   }

    function letTest() {
    let x = 1;
    if (true) {
      let x = 2;  // different variable
      console.log(x);  // 2
    }
    console.log(x);  // 1
   }