var 的迷惑行为(作用域提升)

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,一定要在文件、函数、、、、、、、、、。。。。。。的最开头声明

猜你喜欢

转载自www.cnblogs.com/ssaylo/p/12984387.html