-
var
- 使用var关键字声明的变量,会在所有代码执行之前被声明(但是不会赋值);会自动提升到函数作用域顶部
- 使用var在全局作用域中声明的变量会成为window对象的属性,在函数中定义的变量会成为函数对象上的属性,在函数退出时会被销毁(函数作用域)
- 允许重复声明
//声明提前
console.log(a); //undefined
var a = 1;
console.log(a); //1
var b = 2;
console.log(window.b); //2
var a = 3; //重复声明,后声明的值会覆盖之前声明的值
console.log(a); //3
function help() {
var c = 4;
console.log(c);
}
help();
//函数作用域
console.log(c); //Uncaught ReferenceError: c is not defined
-
let
- 不允许重复声明 (在全局作用域中使用let声明的变量不会成为window对象的属性,但是let声明仍然是在全局作用域中发生的,相应变量会在页面的生命周期内存在。因此为了避免SyntaxError,不能重复声明同一个变量)
- 块儿级作用域
- 不存在变量提升
- 暂时性死区(let、const声明之前的执行瞬间,在声明之前就使用这些变量就会报错,这就是暂时性死区,而var会变量提升,所以不存在)
//不存在变量提升
//console.log(aa); //Uncaught ReferenceError: Cannot access 'aa' before initialization
let aa = 'lala';
console.log(aa); //lala
console.log(window.aa); //undefined
let aa = 'kaka'; //Uncaught SyntaxError: Identifier 'aa' has already been declared
//块级作用域
{
let bb = 'dada';
console.log(bb); //dada
}
console.log(bb); //Uncaught ReferenceError: bb is not defined
-
const
- 声明必须赋初始值
- 不允许重复声明
- 值不允许修改(简单数据类型的值不许修改,复杂数据类型的地址值不许修改)
- 块儿级作用域
- 标识符一般为大写
const cc; //Uncaught SyntaxError: Missing initializer in const declaration
const dd = 3;
const dd = 4; //Uncaught SyntaxError: Identifier 'cc' has already been declared
const A = 1;
A = 2; //Uncaught TypeError: Assignment to constant variable
const B = {name: 'Tony', age: '18'};
B.age = 19;
console.log(B); //{name: 'Tony', age: 19}
{
const C = 5;
console.log(C); //5
}
console.log(C); //Uncaught ReferenceError: C is not defined
-
总结:
声明对象类型或常量使用const,声明其它类型使用let,尽量不使用var;不使用关键字声明的变量会创建在全局作用域中(严格模式下给未声明的变量赋值会导致错误)。
ee = 'in window';
console.log(window.ee); //in window
//严格模式下
"use strict"
ee = 'in window';
console.log(window.ee); //Uncaught ReferenceError: ee is not defined