其实应该只有三种,另外一种是不规范的,就是直接a="a",但是鉴于又新手,所以也将其纳入讨论范围
1.使用var的情况下:var定义的变量可以修改,如果不初始化会输出undefined,不会报错。
//未定义情况下
console.log(a); //打印undefined
//初始化
var a = "aaa";
console.log(a); //打印 aaa
//修改变量
var a = "bbb";
console.log(a); //打印bbb
//循环,检测块级作用域
for( i = 0; i < 5; i++) {
console.log(i); //依次打印0,1,2,3,4
setTimeout(function() {
//定义函数内部变量
console.log(i);
var d = "locald";
}, 1000); //依次打印0,1,2,3,4
}
//访问内部变量//设置定时器,因为要一秒后d才会被定义
setTimeout(function(){console.log(d)},1001);//报错,未被定义
2.使用const的情况下:const定义的变量不可以修改,而且必须初始化,const定义的是一个恒定的常量
//未定义情况下
console.log(a); //报错。没有定义,所以需要先定义
//初始化
const a = "aaa";
console.log(a); //打印 aaa
// //修改变量
const a = "bbb";
console.log(a); //报错,a早已赋值,无法修改
// //循环,检测块级作用域
for( i = 0; i < 5; i++) {
console.log(i); //依次打印0,1,2,3,4
setTimeout(function() {
//定义函数内部变量
console.log(i);
const d = "locald";
}, 1000); //依次打印0,1,2,3,4
}
//访问内部变量//设置定时器,因为要一秒后d才会被定义
setTimeout(function(){console.log(d)},1001);//报错,未被定义
3.使用let的情况下:let是块级作用域,函数内部使用let定义后,对函数外部无影响。
<script>
//未定义情况下
console.log(a); //报错,需要先定义
//初始化
let a = "aaa";
console.log(a); //打印aaa
// //修改变量
let a = "bbb";
console.log(a); //打印a已经被声明了
// //循环,检测块级作用域
for( i = 0; i < 5; i++) {
console.log(i); //依次打印0,1,2,3,4
setTimeout(function() {
//定义函数内部变量
console.log(i);
let d = "locald";
}, 1000); //依次打印0,1,2,3,4
}
//访问内部变量//设置定时器,因为要一秒后d才会被定义
setTimeout(function(){console.log(d)},1001);//报错,未被定义
</script>
注意一点,注意擦看for循环打印出来的,这与var有很大的区别
这里就突出了块级作用域的好处
4.直接使用a=“a“的方式://很不推荐
<script>
//未定义情况下
console.log(a); //报错,需要先定义
//初始化
a = "aaa";
console.log(a); //打印aaa
// //修改变量
a = "bbb";
console.log(a); //打印a已经被声明了
// //循环,检测块级作用域
for( i = 0; i < 5; i++) {
console.log(i); //依次打印0,1,2,3,4
setTimeout(function() {
//定义函数内部变量
console.log(i);
d = "locald";
}, 1000); //依次打印0,1,2,3,4
}
//访问内部变量//设置定时器,因为要一秒后d才会被定义
setTimeout(function(){console.log(d)},1001);//打印locald
</script>