近日看书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被提升了,但是存在暂时性死区,不能提前访问。
一只入门菜鸟,错误之处望路过的大佬们指正批评!