变量
一.var关键字
1.var声明作用域
使用var操作符定义的变量会成为包含它函数的局部变量,该变量将会在函数退出时销毁
function test() {
var a = 'hi';//局部变量
}
test();
console.log(a);//报错
这里的a变量是在test()函数内定义的,当调用test()函数时会给它赋值,当调用结束时将会销毁。
不过在函数内部定义变量时省略var,将会定义一个全局变量
function test() {
a = 'hi';//局部变量
}
test();
console.log(a);//输出'hi'
去掉var之后,此时的a变成了全局变量,可以在函数外调用
2.var声明提升
function test() {
console.log(a);
var a = 'hi';
}
test();//undefined
使用var关键字声明的变量会自动提升到函数作用域的顶部,相当于如下代码
function test() {
var a;
console.log(a);
a = 'hi';
}
test();//undefined
二.let关键字
1.let声明作用域
let声明的范围是块作用域,而var声明的范围是函数作用域
if (true){
var a = 111;
console.log(a);//111
}
console.log(a)//111
var定义的a可以被访问
if (true){
let a = 111;
console.log(a);//111
}
console.log(a)//ReferenceError: a is not defined a没有定义
let定义的a则是报错a未定义
2.let的声明冗余
var age = 1;
var age = 2;
console.log(age)//2
let a;
let a;//Uncaught SyntaxError: Identifier 'a' has already been declared 报错a已经被定义
var a;
let a;//报错
let a;
var a;//报错
let 不允许同一个块作用域中出现两个相同名称的变量,也就是不允许声明冗余
而var定义两个名称相同的变量时,后面的变量将会覆盖前面的变量
3.let不会在作用域中被提升
//name会被提升
console.log(name);//undefined
var name = 'Yuuujio';
//name不会被提升
console.log(name);
let name = 'Yuuujio';//报错 name未定义
4.let的全局声明
let全局声明时与var不同,不会成为window对象的属性
var name = 'Yuuujio';
console.log(window.name);//Yuujio
let name = 'Yuuujio';
console.log(window.name);//undefined
三.const声明
const会定义一个常量,const的行为基本与let相同,但是有两个重要的区别
1.const声明时必须同时赋值
const a;//报错 未定义常量值
2.const声明的变量值不能修改
const b = 1;
b = 2;//报错 给常量赋值
3.其他特性
//const也不允许重复声明
const name = 'Yuujio';
const name = 'Yuki';//报错
//const声明的作用域也是块
const a = 1;
if (true){
const a = 2;
}
console.log(a);//1
4.例外
const声明的限制只适用于它指向的变量的引用。但是如果const变量引用的是一个对象,那么可以修改对象内部的属性
const person = {};
person.name = 'Yuujio';//ok