传统的var
先看一下下面的代码:
function judge(bool) {
if (bool) {
var foo = 'bar';
console.log(foo);
} else {
console.log(foo);
}
}
judge(false);
//输出undefined
如果参照其它语言,就会觉得很奇怪,为什么不是抛出Uncaught ReferenceError的异常。
这其实是变量提升的问题,相当于在解析时将foo
提升到函数的一开始,即相当于以下形式:
function judge(bool) {
var foo;
if (bool) {
foo = 'bar';
console.log(foo);
} else {
console.log(foo);
}
}
judge(false);
块级作用域的let
块级作用域就不用多说,就是用let定义的变量只在定义它的块中有效,出了这个块你就不能访问到它了。
示例:
function judge(bool) {
if (bool) {
let foo = 'bar';
console.log(foo);
} else {
console.log(foo);
}
}
judge(false);
//抛出Uncaught ReferenceError的异常
ES2015中的常量const
ES2015中常量的实现和一般意义上的常量有一定区别,它虽然是不能对常量进行重新定义,但还是能够修改常量的值的。
示例:
const person = ['jack', 'nike'];
person.push('jobs')
console.log(person);
//输出["jack", "nike", "jobs"]
使用场景
风格一:
1、默认使用let
2、变量定义后不再改变使用const
3、在顶级可以var(一般不用)
风格二:
1、默认使用const
2、需要改变变量值时使用let
3、不使用var
个人可以根据自己喜好,选择某一种风格使用即可。