一、var
1、var在全局有效
{
var n = 1;
}
console.log(n);
output:1
2、var可以多次赋值
var n = 2
console.log(n);
output:2
3、var存在变量提升
console.log(num);
var num = 1 ;
output:undefined,脚本运行时,num已经存在,但是没有赋值
4、循环
for (var i = 0; i < 10; i++) {
setTimeout(function(){
console.log(i);
},1000)
}
output:十个10
由于i是var声明的,是全局有效的,所以循环里只有一个i,
setTimeout方法是不阻碍主线程运行的
i等于10时,不符合i<10,才开始执行setTimeout方法,
i的值依然是10,所以输出的是10个10
二、let
1、let 声明的变量只在 let 命令所在的代码块内有效
{
let a = 0;
}
console.log(a) // 报错 ReferenceError: a is not defined
2、let不能重复声明,不能重复声明,不代表不能多次赋值
let a = 1;
let a = 2;
报错:Uncaught SyntaxError: Identifier 'a' has already been declared
3、不存在变量提升
console.log(o);
let o = 1;
报错:Uncaught ReferenceError: o is not defined
4、循环
for (let j = 0; j < 10; j++) {
setTimeout(function(){
console.log(j);
})
}
output:0123456789
每一次循环j都是一个新的变量
三、const
1、const 声明一个只读变量,声明之后不允许改变。意味着,
一旦声明必须初始化,否则会报错
const a;
没有初始化
报错:Uncaught SyntaxError: Missing initializer in const declaration
2、声明后的值,不允许改变
const num = 1;
const num = 2;
再次赋值时报错
Uncaught SyntaxError: Identifier 'num' has already been declared
const 声明的简单类型变量等同于常量