前言
踩着前人的肩膀,努力前行。参考了很多前人的文章。
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...。原文说的更仔细,有更多的内容。