回顾变量提升

165 阅读1分钟

近日看书JS高级程序设计,看到变量部分,记录一下。内容均来自书籍。

1. var关键字

function test1(){
    var a = 1;
}
test()
console.log(a)

上面代码打印出错,访问不到函数作用域

function test2(){
    a2 = 1;
}
test2()
console.log(a2)

上面代码打印1,因为省略var操作符,可以创建全局变量。

function test3(){
    console.log(age);
    var age = 2;
}
test2()

上面代码打印undefined,因为var操作符,把变量声明拉到作用域顶部,赋值留在原地。

2.let

let可以先声明在赋值,但不会像Var一样变量提升。会形成一个暂时性死区,访问会报ReferenceError。 例如:

let name = '测试'
{
  console.log(name) // Uncaught ReferenceError: name is not defined
  let name = 'code'
}

如果不存在变量提升,console.log(name)应该输出测试,但却抛出了ReferenceError,说明let存在变量提升,但是它存在一个“暂时死区”,在变量未初始化或赋值前不允许访问。

let的使用在for循环中最明显,每一次循环都是新建一个块,互不干扰;下面代码来及js高级程序设计。

for(let i= 0;i<5;++i){
    setTimeout(()=>console.log(i),0)
}
//输出0、1、2、3、4

3.const

const使用必须声明且赋值,不会变量提升,也是一个块级作用域。 这个常用于常量或函数的定义,不能修改,这个限制只用于它指向的引用,加入const一个对象,修改对象属性是可以的。

总结

var可以变量提示,但声明提升,赋值留下;const不提升,但生产块级作用域,不允许重复声明,但let可以重复赋值,const不能。let被提升了,但是存在暂时性死区,不能提前访问。

一只入门菜鸟,错误之处望路过的大佬们指正批评!