1. var 变量
- 不存在块级作用域
- 存在“变量提升”现象:即变量可以在声明之前使用,值为underfined
- 可以重复声明
- 不存在暂时性死区
- 在浏览器环境下,var声明的全局变量会成为window对象的属性
var a = 1;
// var a; // 不报错
console.log('函数外var定义a:' + a); // 1
function change() {
a = 4;
console.log('函数内var定义a:' + a); // 4
}
change();
console.log('函数调用后var定义a为函数内部修改值:' + a); // 4
2. let 变量(ES6新增)
2.1 基本用法
用法类似于var,但声明的变量只能在let命令所在的代码块内有效。
{
let a = 1;
var b = 2;
}
console.log(a); // error
console.log(b); // 2
适用情况–for循环:
- 使用let声明
for (let i = 0; i < 10; i++) {
console.log(i); // 输出0-9十个数字
}
console.log(i); // error
- 使用var声明
for (var i = 0; i < 10; i++) {
console.log(i); // 输出0-9十个数字
}
console.log(i); // 输出10
这种情况下用来计数的循环变量i就会被泄露为全局变量。
2.2 不存在变量提升
- 使用let的情况
// 在声明a之前,a并不存在,此时使用它会抛出错误
console.log(a); // error
let a = 2;
- 使用var的情况
console.log(b); // underfined
var b = 2;
// 相当于
var b;
console.log(b); // underfined
b = 2;
console.log(b); // 2
2.3 暂时性死区
在代码块之内,使用let命令声明变量之前,该变量都是不可用的,称为“暂时性死区(TDZ
)”
if(true) {
// TDZ开始
a = 1; // error
console.log(a); // error
let a;// TDZ 结束
console.log(a); // 1
a = 2;
console.log(a); // 2
}
不允许重复声明
// error
function() {
let a = 1;
var a = 2;
}
// error
function() {
let a = 1;
let a = 2;
}
// error
function(arg) {
let arg;
}
// 不报错。外层代码块不受内层代码块的影响
function(arg) {
{
let arg;
}
}
- 允许在块级作用域内声明函数,该函数在块级作用域之外不可引用。
// 在ES6中报错
function f() {
console.log('111');
}
(function() {
if (fasle) {
function f() {
console.log(222);
}
}
f();
}());
注意:
- 避免在块级作用域内声明函数
- ES6的块级作用域允许函数的规则只在使用大括号的情况下成立,如果没有大括号就会报错。
3. const 变量(ES6新增)
- const声明一个只读变量,一旦声明就不可以修改,而且必须初始化。
- 不能重复声明,作用域也为块级作用域
const b = 2;//正确
// const b;//错误,必须初始化
console.log('函数外const定义b:' + b);//有输出值
// b = 5;
// console.log('函数外修改const定义b:' + b);//无法输出