var和let块级作用域

什么是变量作用域?

变量在什么范围内是可用的。

没有块级作用域引发的问题?

那么函数的值就可能在被使用前修改。

if(true){
    var name = "why"
  }
  name = "lsii"
  console.log(name)  // lisi

if语句为真,所以代码是可以执行的。而我们定义的变量name在打印的是lisi,原因是没有块级作用域。

比如:
有五个按钮,我们的需求就是,就是点击按钮,打印出当前是哪一个按钮被点击了。

<button>按钮1</button>
<button>按钮2</button>
<button>按钮3</button>
<button>按钮4</button>
<button>按钮5</button>

<script>
  var btns = document.getElementsByTagName('button')
  for (var i=0;i<btn.length;i++){
    btns[i].addEventListener('click',function () {
      console.log('第'+ i +'个按钮被点击');
    })
  }
</script>

此时,就会产生一个问题,我们点击第一个按钮,却始终打印的是第五个。因为此时变量i已经被修改了。
在这里插入图片描述
解决方案:
(1)、闭包

for (var i=0;i<btns.length;i++){
    (function (i) {
      btns[i].addEventListener('click',function () {
        console.log('第'+ i +'个按钮被点击');
      })
    })(i)
  }

在这里插入图片描述
为什么闭包可以解决问题?
因为函数是一个作用域。
(2)、let
let有自己的块级作用域。

for (let i=0;i<btns.length;i++){
    btns[i].addEventListener('click',function () {
      console.log('第'+ i +'个按钮被点击');
    })
  }

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值