var,let,const
这三个都能用来声明,但是声明的变量是有区别的
1.var
var声明的变量存在变量提升,JavaScript程序会在执行时将var 声明的变量提升到所在作用域的最前面,但是赋值还会在原来的位置
<script type="text/javascript">
console.log(a); //undefind
var a = '溏心荷包蛋';
</script>
这个a会被提升到console.log前,就像下面这样,所以他在执行console.log时找不到为a赋的值
<script type="text/javascript">
var a;
console.log(a); //undefind
a = '溏心荷包蛋';
</script>
2.let
let所声明的变量只在它所在的块级区域有效,且不存在像var带来的变量提升
还是用上面的方法举例,我们把var换成let,结果就会报错,提示引用错误,a未被声明,因为在console.log执行的时候,let不会提升变量,就是没有声明变量a
<script type="text/javascript">
console.log(a); //ReferenceError:a is not defind
let a = '溏心荷包蛋';
</script>
let声明的变量会绑定它所在的块级作用域,不受外界的影响,也称暂时性死区
<script type="text/javascript">
var egg= '溏心荷包蛋';
if(true){
let egg = '溏心';
console.log(egg);//溏心
}
console.log(egg);//溏心荷包蛋
</script>
用两个for循环做对比用var声明i,这时i是全局的i,是执行过for循环的i的值
但是用let声明的i执行在代码块内能正常执行,放在外面就报错ReferenceError,如果不将上一个for循环注释掉,此时在用let声明的代码块外打印i的值,它获取的就还是第一个用var声明for循环的i的值为8,中间的let声明只在代码块内部执行了
<script type="text/javascript">
for(var i=0;i<8;i++){
// console.log(i);//0,1,2,3,4,5,6,7
}
console.log(i);//8
for(let i=0;i<6;i++){
console.log(i);//0,1,2,3,4,5
}
console.log(i);//8
</script>
3.const
const声明的是常量,而且声明时必须要赋值,赋值不能被更改,
<script type="text/javascript">
// const PI;//报错
const PI = 3.1415;
const PI = 456;//报错
</script>