# 变量

TIP

在 js 中变量代表一个值的名称。相当于人名一样,变量名是指向计算机中的某个内存地址。也可以理解为内存地址的代号。

在JavaScript中变量就是用一个变量名表示,变量名只能有大小写英文、数字、$_的组合,且不能用数字开头。变量名也不能是 js 的关键字,如while、switch等。声明一个变量用var语句

var a = '';
var $a;
var _a;
var a_007 = '007';

以上都是合格的变量名。

在 js 中,使用等号 = 对变量进行赋值。可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var声明一次,例如:

var a = '';
a = 321;

注意:这两行代码赋值的类型是不一样的,但是这种操作 js 是支持的。因为 js 是动态类型语言。

TIP

怎样理解 = 号呢?他是把变量保存到内存中,然后把内存地址指向变量名。

# 严格模式

.js 文件的第一行写上 'use strict';,就代表你开启了严格模式。

这是一个字符串,不支持strict模式的浏览器会把它当做一个字符串语句执行,支持strict模式的浏览器将开启strict模式运行js 。

js 在设计之初,为了方便初学者学习,并不强制要求用var声明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var声明就被使用,那么该变量就自动被声明为全局变量:

a = 0; // a 是全局变量

如果同意页面中有两个a, 并且也都没有用 var 声明。这会产生难以预期的结果。

使用var声明的变量则会有所限制,它的范围被限制在该变量被声明的函数体内(之后会讲函数部分的知识),这样变量的作用域才会有所限制。

为了修补 js 这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在 strict 模式下运行的 js 代码,必须强制通过 var 声明变量,未使用var声明变量就使用的,将导致运行错误。

正确的声明变量方式

'use strict';
var fn1 = function() {
  var a = 0;
}
var fn2 = function() {
  var a = '123';
}

# ES6 中的变量声明

# let: var 的升级版

var 声明的变量存在一定的问题。他的作用于是函数级的,并且变量名还可以重复声明,这很不科学。

'use strict';
var fn1 = function() {
  console.log(a); // undefined
  if (false) {
    var a = 0;
    var a = 1; // a 居然可以声明两次,并且还不会报错
  }
}

明明 a 没有被定义,但为什么可以访问到。这里涉及到一个 变量提升 的概念。用 var 声明的变量,会被先提升到函数体的顶部定义一次。这就是所谓的函数级作用域。但是我们现在想要的是 {...} 块级作用域。这才更符合人类直觉。

let 就是专门解决此类问题的,他是 ES6 引入声明变量方式。并且 let 声明过的变量,不可以重复此声明。以后声明变量都用 let,忘记 var 吧!

let 声明变量,此时程序会抛异常

'use strict';
let fn1 = function() {
  console.log(a); // Error: a is not defined
  if (false) {
    let a = 0;
  }
  let b = 0;
  let b = 1; // 报错 'b' has already been declared
}

# 不可更改的变量

constlet 的升级版,通过 const 声明的变量叫“常量”。它不可以在被赋值第二次赋值。

const a = '123';
a = 1; // TypeError: Assignment to constant variable.

const 是非常有用的,比如将来你会用到的 Enum 概念时,就需要借助 const 的特性来声明一批不可变的变量。

上次更新: 7/5/2020, 7:19:14 PM