console.log(i);
for(var i=0;i<2;i++){
console.log(i);
}
这显示了浏览器中的某些意外输出。谁能解释一下? 输出为:
在不同的控制台上,它实际上有很大的不同。 Mozilla文档说:
// myVarVariable 在此处可见
for(var myVarVariable = 0; myVarVariable <5; myVarVariable ++){
// myVarVariable对整个函数可见}// myVarVariable 在此处可见
答案 0 :(得分:2)
这是由于吊装引起的。在javascript中,用var
声明的变量显示提升。提升是将所有变量声明置于Java脚本作用域顶部的过程。但是请注意,它们未分配以下代码中分配的值。
let
和const
没有显示此行为
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
,然后循环执行两次,并给您0
和1
。
现在您还可以在i
之后访问变量for loop
,这是因为var
的功能范围。这意味着如果没有在任何函数中定义,则用关键字var
定义的变量将全局可用。
如果您不希望出现这种情况,请使用let
而不是var
。 let
关键字提供块级作用域,这意味着使用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 hoisting,var
声明实际上被移到其执行上下文范围的顶部(在本例中为全局范围)。因此,您的代码与以下代码相同:
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
}