一、 var与let的区别
(1) 变量声明
<script type="text/javascript">
var a = 1;
var a = 2;
a = 3;
console.log(a);
/*
var:
1.同一作用域内可以重复声明且声明后可以改变它的值
2.a是全局变量
*/
</script>
<script type="text/javascript">
let a = 1;
//var a = 2; 报错
a = 3;
console.log(a);
/*
let :
1.同一作用域内不可以重复声明且声明后可以改变它的值
2.a是全局变量
*/
</script>
(2) 作用域
任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
<script type="text/javascript">
if(true){
var a = 1;
}
console.log(a);
/*
var :
1.全局作用域
2.函数作用域
3.a全局变量
*/
</script>
<script type="text/javascript">
let a =1
{
let a =2;
console.log(a); //输出2
}
console.log(a); //输出1
/*
let :
1.全局作用域
2.块级作用域 {}
3.输出1的a是全局变量,输出2的a是局部变量
*/
</script>
(3) 预解析
<script type="text/javascript">
console.log(a); //输出 undefined
var a =1;
/*
var :
1.存在预解析
2.a 全局变量
*/
</script>
<script type="text/javascript">
console.log(a); //报错
let a =1;
/*
let:
1.不存在预解析
2.a 全局变量
*/
</script>
二、 const常量
<script type="text/javascript">
console.log(a); //报错
const a =1;
/*
const:
1.全局作用域
1.不存在预解析
2.全局变量
*/
</script>
<script type="text/javascript">
const a =1;
const a =2; //报错
/*
const:
1.不能重复声明
2.全局变量
*/
</script>
<script type="text/javascript">
{
const a =1;
console.log(a); //输出1
}
console.log(a);//报错
const a =1;
/*
const:
1.块级作用域
2.局部变量
*/
</script>
三、 作用域
<script type="text/javascript">
(function() {
var a = 1;
console.log(a); // 输出 1
})();
// console.log(a); // 报错
/*
通过var定义的变量只能在块级作用域内访问不能跨函数作用域访问
*/
</script>
<script type="text/javascript">
{
var a = 1;
console.log(a); // 1
}
console.log(a); // 1
/*
此处var变量属于全局变量,可以跨块级作用域访问到。
*/
</script>
<script type="text/javascript">
{
let a = 1;
console.log(a); // 1
}
console.log(a); // 1
/*
此处let变量是属于局部变量,不可以跨块级作用域访问到。
*/
</script>
<script type="text/javascript">
if(true) {
var a = 1;
}
console.log(a); // 1
for(var i = 0; i < 2; i ++) {
var b = 3;
};
console.log(i); // 2
console.log(b); // 3
/*
if语句和for语句中用var变量可以在外面访问到属于全局变量
if语句和for语句属于块级作用域,不属于函数作用域
*/
</script>
- var:同一作用域内可以重复声明且声明后可以改变它的值、全局作用域、函数作用域、存在预解析。
- let:同一作用域内不可以重复声明且声明后可以改变它的值、全局作用域、块级作用域、不存在预解析。
- const:同一作用域内不可以重复声明、声明时必须赋值且声明后不可以改变它的值、全局作用域、块级作用域、不存在预解析。
- if语句和for语句属于块级作用域,不属于函数作用域。