js中有三个关键字可以声明变量,分别为var、let和const,在ES6之前只能用var声明变量。
1.var特点
1.1 函数级作用域
如果不使用var定义变量,变量将会成为全局变量
function test(){
msg = "123";
console.log(msg);
}
//运行
test()
//执行结果:123
msg
//执行结果:"123"
//全局变量会成为window对象的属性
window.msg
//执行结果:"123"
在函数中定义的变量,无法在函数执行期外访问
function test(){
var msg = "123";
console.log(msg);
}
//运行
test()
//执行结果:123
msg
//执行结果:error:msg is not defined
1.2 作用域提升
先取值再声明,相当于先声明,没有初始化赋值
function test(){
console.log(msg);
var msg = "123";
}
//运行
test()
//执行结果:undefined
msg
//执行结果:error:msg is not defined
等同于
function test(){
var msg;
console.log(msg);
msg = "123";
}
//运行
test()
//执行结果:undefined
msg
//执行结果:error:msg is not defined
1.3 重复声明不报错
function test(){
var msg;
var msg = "123";
console.log(msg);
}
//运行
test()
//执行结果:123
msg
//执行结果:error:msg is not defined
1.4 声明的全局变量会成为window的属性
var msg = "123";
//运行
msg
//执行结果:"123"
window.msg
//执行结果:"123"
2.let特点
2.1 块级作用域
使用var会把变量声明到全局
if(true){
var msg = "123";
}
//运行
msg
//执行结果:"123"
在{ } 中声明的变量具有块级作用域,会把变量限制在本条if语句中使用
if(true){
let msg = "123";
}
//运行
msg
//执行结果:error:msg is not defined
2.2 没有作用域提升
先取值再声明会报错
function test(){
console.log(msg);
let msg = "123";
}
//运行
test()
//执行结果:error:Cannot access 'msg'
2.3 不能混用var和let声明变量
同时使用let和var重复声明变量会报错
function test(){
let msg = "123";
var msg = "123";
console.log(msg);
}
//编译报错:error:Identifier 'msg' has already been declared
2.4 全局声明变量不是window对象的属性
let msg = "123";
//运行
msg
//执行结果:"123"
window.msg
//执行结果:undefined
3.const特点
3.1 声明同时必须初始化
const主要用于声明常量,声明的同时需要初始化赋值
const num = 10;
//不会报错
//运行
num
//执行结果:10
声明时不赋值会报错
const num;
//编译报错:error:Missing initializer in const declaration
3.2 初始化后不能修改
const num = 10;
num = 20;
//编译报错:error:Assignment to constant variable
3.3 如果定义的是对象,可以修改它的属性
const obi = {a: 1}
//运行
obj = {}
//编译报错:error:Assignment to constant variable
obj.b = 2
//执行结果:2
obj
//执行结果:{a: 1, b: 2}
3.4 不能用于声明用于会自增的迭代变量
for(const i=0;i<5;i++){
console.log(i);
}
//编译报错:error:Assignment to constant variable
在for…of,for…in中可以使用
for(const key in {a: 1,b: 2}) {
console.log(key);
}
//编译结果:
//a
//b
for(const key of 'abc') {
console.log(key);
}
//编译结果:
//a
//b
//c