如需转载请注明来源
关键词:let , const
let
介绍一下let的特性:
- let不存在变量提升:它是按照解析顺序来赋值的
console.log(a)
let a= 0;//报错
- 使用let会存在暂时性死区(TDZ : temporal dead zone)
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var t = 0;
var a = 'aaa';
{
console.log(a)
t++;
let t = 99;
}
//先打出'aaa',之后是'ReferenceError: t is not defined',
//报错的原因在于t++;这个语句。let 将会提升这个变量到语句块的顶部。
//然而,在这个语句块中,在变量声明之前引用这个变量会导致一个 的结果, 因为let变量 在"暂存死区" (从块的开始到声明这段).
- let不允许重复声明:
{
var a=0;
let a=1;
//报错
}
{
let a=0;
let a=1;
}
//报错
块级作用域
记得在学作用域的时候ES5之前规定只有函数作用域和全局作用域,ES6之后规定可以有块级作用域(if,switch,for,while的大括号都是块级作用域),现在我们可以使用let或者const来触发块级作用域
{
let a = 0;
const b =1;
}
console.log(a)
console.log(b)
//报错,因为let或者const触发了块级作用域,可以把大括号看成一个作用域,外部访问不到内部。
基于块级作用域和let的特性我们可以放弃以前的立即执行函数的写法,换成:
{
let fn = function(){
//dosomething
}
fn();
}
const
const具有let以上的所有特性,在此我们主要了解const和let的不同:
const声明一个只读的常量。一旦声明,常量的值就不能改变。这不意味着常量指向的值不可变
const与let最大的区别是,你可以操作let的值,而const只要定义下来就不能去改变它
const a=0;
a++;//报错 "TypeError: Assignment to constant variable."
但是,如果const存的指针指向的是一个对象的话,对象是可以改变,但是const存的指针不能改变~~~
const a={};
a.name='lwk';
console.log('lwk')
//可行,打印出lwk
a={ name:'lwk' };
//报错~~因为改变了指针