今天看到变量声明,突然发现自己对3个关键字的作用域有些迷了,写篇文章反思一下啊。
JavaScript中变量是松散类型,也就是变量可以保存任何类型的值,我们声明的变量不过是可以保存任何值的占位符。
JavaScript中声明变量的关键字主要有3个,下面是自己对这3个关键字的作用与区别的理解。
1. var
- 作用域:函数。如果在函数内部定义变量时省略var关键字,则会创建一个全局变量
eg:
function test () {
name = "zhangsan"; // 全局变量
}
- 声明提升。var关键字声明的变量会自动提升到函数作用域顶部。
eg:
function test () {
console.log(name); // undefined
var name = "zhangsan";
}
// 在执行至函数时,会首先对内部var关键字声明的变量就行定义(只是定义未初始化,所以为undefined)
- 可以反复多次使用var声明同一个变量。个人理解,因为var的声明提升,所以多次声明只是修改值的操作,不会产生重命名变量。
2. let
-作用域:块。{}、if、for语句块
- 不允许冗余声明。
eg:
let age;
let age;// error
var name;
var name;// 没有问题
var id;
let id;// error,不会因为使用不同关键字而影响冗余声明。let和var声明的是同一个变量,类型并没有不同,只是作用域不同,不允许。
// 下面这种情况不会出错,因为这是嵌套声明,在同一个块中没有重复变量。
let name = "zhangsan";
if(true){
let name = "lisi";
}
3. const
与let基本相同,区别就是const声明的相当于一个常量,修改常量时不允许的,所以const声明的变量不能修改,也就不能使用const声明迭代变量(迭代变量会自增)。
但是可以在for-in,for-of中使用const声明一个不会被修改的循环变量。
eg:
for(const key in {a:89,b:78}){
console.log(key);
}
写在最后。使用var在全局作用域声明的变量会成为window对象的属性,但是let不会。