javascript 循环赋值问题能否使用bind解决?

发布于 2022-09-02 14:30:25 字数 924 浏览 16 评论 0

html代码:

<div id="t1">
  <button>btn1</button>
  <button>btn2</button>
  <button>btn3</button>
  <button>btn4</button>
  <button>btn5</button>
</div>

js代码

$(function(){
  var div = $("#t1");
  for(var i=0,tmp;i<5;i++){
    div.find("button:eq("+i+")").on("click",function(){
      alert(i);
    });
  }
});

这个问题就是每次点击按钮应该弹出0,1,2,3,4
解决办法我知道的是使用闭包,代码如下:

$(function(){
  var div = $("#t1");
  for(var i=0,tmp;i<5;i++){
    (function (b){
      div.find("button:eq("+b+")").on("click",function(){
        alert(b);
      });
    })(i)
  }
});

bind的作用是改变函数的this指向,如果不使用这种方式还有其他解决方式么?
**不要在按钮上添加其他属性的方案以及类似的修改html的解决方案?
防止别人再回答关联到html、DOM元素上,就是闭包、bind、自执行函数问题**
我上次面试面试官问过bind可以解决这样的问题么

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

甜嗑 2022-09-09 14:30:26

面试官想要的答案应该是事件委托。

t1.addEventListener('click', e => {
    if(e.target.nodeName === 'BUTTON')
        alert(e.target.innerText)
})
眉目亦如画i 2022-09-09 14:30:26
<script>
        $(function() {
            var list = $("#t1").find('button');
            list.each(function(i, e) {
                e.onclick = function() {
                    console.log(i)
                }
            })
        });
    </script>
沉默的熊 2022-09-09 14:30:25

bind除了可以传入绑定对象,还可以传入调用时的参数。

var btns = document.querySelectorAll('button');
function say(idx){
    alert(idx);
}
for(var i=0;i<5;i++){
    btns[i].onclick = say.bind(btns[i], i);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文