什么是变量?
JavaScript 变量是存储数据值的容器。
变量是由两个部分构成的:
变量名称,一般来说,赋值符号左边的就是变量。
变量的值,一般来说,赋值符号右边的就是变量的值。
例如:let a = 1;,其中a就是变量名称,1就是变量的值。
在JS中,我们是使用关键字var来声明变量的,会有以下几点:
- 可以一次性声明一个; 即
var a = 1;
var b = 2;
var c = 3;
- 也可以一次性声明多个;即
var a = 1,b = 2,c = 3;
- 而且允许重复声明变量,不会出错,即
var a = 1;
var a = 2;
- 遗漏声明,即
a = 1;
变量的提升
全局作用域和局部作用域
全局作用域:整个JS执行环境。
局部作用域:通过创建一个函数就开辟出了一个局部作用域。
全局变量和局部变量
全局变量:在全局作用域都可以访问的变量。
局部变量:只能在当前局部作用域访问的。
var提升
JS代码在执行前会进行预编译,则会进行变量的提升。例如:
console.log(a);
var a = 1;
console.log(a);
输出结果为:undefined;1
执行过程为:
var a;
console.log(a);
a = 1;
console.log(a);
函数的提升
f()
function f(){
console.log(1);
}
函数被提升了,所以你可以先定义,再使用,输出:1。
为了防止提升,在ES6中提出了关键字
let和const
let
与var类似,用来定义变量
let存在以下特点:
- 块级作用域(第三种作用域)。let所声明的变量,只在let命令所在的代码块内有效。
例如:
{
let a = 1;
let b = 2;
console.log(b);
}
console.log(a);
此时只会打印出b,不会打印出a;
{}具有划分作用域的能力
例如:
{
let a = 1;
let b = 2;
{
let a = 10;
console.log(a,b);
}
}
console.log(a);
console.log(b);
打印出:
- let没有“变量提升”现象。
- 不会成为window对象的属性
- 暂时性死区(TDZ)
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。 在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal deadzone,简称TDZ)说白了,就是要先定义变量,再使用。
const常量
特点:
- const:声明常量。值不能改变。
- 必须立即初始化
- const只在其块级作用域内有效。
- const也不存在声明提升
- 也存在暂时性死区