踩着前人的肩膀,努力前行。参考了不少前人的文章。es6
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。它们的做用域只在一个函数内部或者一个代码块内部。code
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(暂时性死区)get
{ console.log(value) // 报错 let value = 'lala' }
咱们都知道,JS引擎扫描代码时,若是发现变量声明,用 var 声明变量时会将声明提高到函数或全局做用域的顶部。可是 let 或者 const,会将声明关进一个小黑屋也是TDZ(暂时性死区),只有执行到变量声明这句语句时,变量才会从小黑屋被放出来,才能安全使用这个变量。io
本文基本是参考https://www.jianshu.com/p/287...。原文说的更仔细,有更多的内容。console