<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>块级作用域</title>
</head>
<body>
<!-- <script type="text/javascript">
// {}包含的范围 是块级作用域
// 块级作用域中,使用var声明的变量,依然是全局变量
{
var a = 100;
console.log(a);
}
console.log(a);
// let 声明块级变量 只能在当前的块级作用域使用
{
let b = 200;
console.log(b);
}
console.log(b);//报错
</script> -->
<!-- <script type="text/javascript">
//if 代码块
if(true){
let c = 300;
console.log(c);
}
console.log(c); //报错
</script> -->
<!-- <script type="text/javascript">
//块级作用域 没有变量提升
{
// console.log(d);
// let d = 400;
}
</script> -->
<!-- <script type="text/javascript">
//块级作用域 只有块级变量概念,没有块级函数概念
{
//function关键字定义的函数,就是全局函数
fn();
function fn(){
console.log(500);
}
let f1 = function(){} //属于块级变量,这种函数不会预加载
}
fn();
</script> -->
<!-- <script type="text/javascript">
//let定义块级变量,一般不要在全局直接用
//全局使用var
// let num = 100;
// console.log(100);
// let num = 200; //会报错
{
let a = 100;
console.log(a);
//同一个块级作用域中,块级变量可以重新赋值
a = 200;
console.log(a);
a = 400;
console.log(a);
//同一个块级作用域中,块级变量不能重复声明
// let a = 300; //报错
// console.log(a);
}
</script> -->
<script type="text/javascript">
//for循环i丢失的问题
//循环绑定事件、循环设置定时器(指定的函数,在循环结束后才调用)
/*for(var i=0; i<5; i++){
//设置定时器,1秒后,输出循环变量i的值
(function(m){
setTimeout(function(){
console.log(m);
}, 1000);
})(i);
}*/
for(let i=0; i<5; i++){
//设置定时器,1秒后,输出循环变量i的值
//每次循环,都会产生一个块级作用域,其中的块级变量i 互相不影响
setTimeout(function(){
console.log(i);
}, 1000);
}
</script>
</body>
</html>