写在之前
- 作用域:
- ES6加入了块作用域。
- 函数作用域:只能在函数内部访问。
- 块作用域:只能在代码块里访问,代码块由 {} 括起来。
提出时间不同
- var在ECMAScript的所有版本中都可用。
- let、const在ES6及之后的版本中可用。
const
- const声明的时候必须对其赋值。
const var1; //程序报错
const var2 = "";
const var3 = 1;
- const声明的是常量,不能对其值进行修改。
- 如果const声明的是Object,那么可以修改Object内部的属性值。
const Obj1 = {
name : "john",
age : 20
}
Obj1.name = "John";
Obj1; //{name:"John", name:20}
也可以增加或删除属性:
const obj = {};
obj.name = "a";
- const声明的变量不可以在声明之前使用(暂时性死区),否则会出现Reference Error。
- 在同一个块作用域,const声明的变量名不可以重复使用,否则会出现Syntax Error。
- const的作用域是块作用域。
var
- var声明的时候可以不赋值,这时变量的值是undefined。
- var声明的是变量,可以修改。
- var声明的变量,可以在声明之前使用,在声明之前使用时值是undefined(var变量声明提升)。
document.write(a + "<br/>"); ##undefined
var a = 1;
document.write(a); ## 1
- 在同一个函数作用域,var声明的变量名可以被第二次声明,第二次声明之后,覆盖原来的变量。
var var1; //第一次使用变量名var1
var var1 = 1; //第二次使用变量名var1
var1; // 1
- var声明的范围是函数作用域。
由于var声明的变量作用于范围是函数作用域,如果使用var定义for循环变量,会出现问题:
for(var i = 0;i < 5;i++)
{
console.log(i);
}
在循环体结束之后,变量 i 也不会被销毁。
let
- let声明时可以不赋值。
- let声明的是变量,可以对其进行修改。
- let声明的变量不可以在声明之前使用。
- 在同一个块作用域,let声明的变量名不可以重复使用。
- let声明的范围是块作用域,块作用域是函数作用域的子集。
{
let let1 = 1;
}
let1; //变量let1未被声明。
由于var声明的变量存在声明提升,且let存在声明冗余报错,因此下面这种方式也会出现Syntax Error。
let a = 1; //Syntax Error
var a = 1;
声明风格建议
- 不使用var声明变量。
- 尽量使用let、const。