var、let和const
1.1var:全局作用域(函数内),声明存在变量提升,好用是好用,难受也难受!
执行javascript代码时会分为俩个阶段,预编译阶段和运行时阶段,其中在预编译阶段时候会进行变量声明提升,意思就是会将var定义的变量声明放到代码顶部,变量赋值则是在代码运行时阶段进行,可以通过下面的实例来理解一下JS执行时的变量提升。
console.log(a);
var a = 0;
// 等价于
var a = undefined;
console.log(a);
a = 0;
当然,除了变量提升外,函数提升也是一样的,大家感兴趣的可以自己试一下。
function fun() {} // 这种声明写法会导致函数提升,所以不论声明在什么位置,都可以调用它,且它本身不会执行
var foo = function(){} // 这种写法会导致变量提升,但是不会导致函数提升,这时候就必须先声明再调用
2.1let:块级作用域,可以看成{}形成一个块级作用域
首先let声明变量不会进行变量提升,也就是说如果想要使用let声明的变量,必须在使用之前声明该变量;
在for循环中可以通过let来给每一次循环时的变量分配各自作用域,从而互不影响。
// 不存在变量提升
console.log(a); // a is not defined.
let a = 1;
// 块级作用域
let b = 1;
{
console.log(b) // 1 作用域内可以访问作用域外申明的变量
let c = 1;
}
console.log(c) // c is not defined. 作用域外访问不到作用域内申明的变量
3.1const:块级作用域
和let关键字一样会形成块级作用域,但是const通常用来声明一个常量!
对于栈存储类型数据来说,通过const申明赋值之后便不可更改;
对于堆存储类型数据来说,通过const申明赋值之后堆引用地址不可更改,但是可以更改堆地址对应的数据(比如对象的属性,数组的选项等!)
4.1变量的命名规则与规范
命名规则(必须遵守):
- 由字母、数字、下划线、
$符号组成,开头不能是数字。 - 不能使用关键字和保留字
- 区分大小写
命名规范(建议遵守):
- 命名要有意义
- 遵守驼峰命名法。首字母小写,后面单词的首字母需要大写。