js变量与常量

183 阅读2分钟

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变量的命名规则与规范

命名规则(必须遵守):

  • 由字母、数字、下划线、$符号组成,开头不能是数字。
  • 不能使用关键字和保留字
  • 区分大小写

命名规范(建议遵守):

  • 命名要有意义
  • 遵守驼峰命名法。首字母小写,后面单词的首字母需要大写。