var的作用域提升
我们先来看下面的代码
for(; i < 10; i++) {
let i = 0;
console.log(i)
}
// Uncaught ReferenceError: i is not defined at <anonymous>:1:9
这意味着let 并不会有作用域的提升
接下来我们看下面的代码
var i = 0
for(;i < 10; i++) {
let i = 0;
console.log(i);
}
// 输出了 10 个 0
我们来分析一下这段代码,我们看到,开始的用 var 定义的 i,在循环体里面随着 i <10 做了十次自增。然后在子作用域里面又存在着一个自作用于里面的 i,循环了十次,输出了 10 次 let i = 0
紧接着,我们再看看下面的这段代码
for(; i < 10; i++) {
let i = 0;
console.log(i);
}
// Uncaught ReferenceError: i is not defined at <anonymous>:1:9
然后对比这个
for(; i < 10; i++) {
var i = 0;
console.log(i);
}
// undefined
再看看这个
for(let i = 0; i < 10; i++) {
let i = 0;
console.log(i);
}
// 输出了 10 个 0,只是说在这里面就拿不到 i 了
// 以上这个我们可以理解为 父作用域和子作用域,类似于:
{
let i =0;
{
let i = 1;
console.log(i);
)
console.log(i);
}
// 1 0
var 是有迷惑行为的(var 预处理机制)
for(i = 0; i < 10; i++) {
var i;
console.log(i);
}
// 等同于
var i;
for(i = 0; i < 10; i++) {
console.log(i);
}
//等同于
for(i = 0; i < 10; i++) {
console.log(i);
var i;
}
//甚至等同于
for(i = 0; i < 10; i++) {
console.log(i);
}
var i;
所以,以后用 var,一定要在文件、函数、、、、、、、、、。。。。。。的最开头声明