var
var声明的变量可进行变量提升,let和const不会
var可以重复声明
var在非函数作用域中定义是挂在到window上的
let
let声明的变量只在局部起作用
let防止变量污染
不可在声明
const
const声明的变量只在局部起作用
const防止变量污染
不可在声明
不可被改变
如果使用const声明的是对象的话,是可以修改对象里面的值的。也就是说:只要对象指向的地址不被修改,就是允许的。
关于let和const有几个小tips:
1.let 关键词声明的变量不具备变量提升;
2.let 和 const 声明只在最靠近的一个块中有效;
3.当使用常量 const 声明时,请使用大写变量,如:CAPITAL_CASING;
4.const 在声明时必须被赋值,否则会报错。
5.使用let会出现暂时性死区,原因是let所声明的变量会锁在它所在的作用域里,不允许访问,就是说,它也会先扫描一遍,把let声明的变量保存起来,但是不允许使用,这时候你访问a,由于此作用域中有a,就不用访问外面的a了,但是你不能在它声明之前访问它。
6. 使用let和const时不能重复声明。
7. 使用var声明的全局变量或者未声明的变量都会归属到window对象下,但是使用let和const声明全局变量时不会发生这种情况。
拓展: 如何使用ES5标准来实现let,换言之就是如何实现块级作用域。(答:使用匿名函数)
变量提升:只提升变量,不提升值
var a='Hello World';
(function(){
alert(a);
})()
经过运行之后,弹出“Hello World”。
继续往下:
var a='Hello World';
(function(){
alert(a);
var a='I love you';
})()
运行结果是 undefined,这就是JavaScript中的变量提升(Hoisting)。
根据变量提升以及js的作用域(块级作用域)的分析,得知 上面代码真正变成如下:
var a='Hello World';
(function(){
var a;
alert(a);
a='I love you';
})()
所以在写js code 的时候,我们需要把变量放在函数级作用域的顶端,比如我在下面所举的例子:var a,b,c;。以防止出现意外。
(function(){
var a,b,c;
a='One';
b='Two';
c='Three';
})()