前言

踩着前人的肩膀,努力前行。参考了很多前人的文章。

1.变量声明const和let

es6之前声明变量只能用var,var的特点是无论声明在何处,都会被视为声明在函数的最顶部(不在函数内即在全局作用域的最顶部)

function test(){
    if(false){
        var name = "zhangsan";
    }else{
        console.log(name);  //此处访问值为undefined    
    }
    console.log(name);  //此处访问值为undefined
}

可以看到虽然打印结果是undefined,但是并没有报错。那是因为被js编译过结果就变成了

function test(){
    var name;   //这就是js的变量提升
    if(false){
        name = "zhangsan";
    }else{
        console.log(name);  //此处访问值为undefined    
    }
    console.log(name);  //此处访问值为undefined
}

再来看ES6新增的let,const。它们的作用域只在一个函数内部或者一个代码块内部。

  function test() {
    if(flag) {
       let name = 'zhangsan'
    } else {
        //此处访问会直接报错。访问不到。
        console.log(test)
    }
  }

const作用域和let一样。但是他通常被用于定义常量。就是它的值被设置完成后就不能再修改了。

    const name = 'lux'
    name = 'joe' // 再次赋值此时会报错

但是,如果 const 的是一个对象,对象所包含的值是可以被修改的。抽象一点儿说,就是对象所指向的地址不能改变,而变量成员是可以修改的。

    const student = { name: 'cc' }
    // 可以成功
    student.name = 'yy';
    // 如果这样子就会报错了
    student  = { name: 'yy' };

还有TDZ(暂时性死区)

{
    console.log(value) // 报错
    let value = 'lala'
}

我们都知道,JS引擎扫描代码时,如果发现变量声明,用 var 声明变量时会将声明提升到函数或全局作用域的顶部。但是 let 或者 const,会将声明关进一个小黑屋也是TDZ(暂时性死区),只有执行到变量声明这句语句时,变量才会从小黑屋被放出来,才能安全使用这个变量。

2.未完待续

本文基本是参考https://www.jianshu.com/p/287...。原文说的更仔细,有更多的内容。


小学生
495 声望4 粉丝

路漫漫其修远兮,吾将上下而求索。