再次接触闭包

第一次接触闭包,是在一个小DEMO里面,当时给我留下来的印象是,闭包本来是不存在的,我们要人为的去创造,现在又一次接触到,才发现原来的认知是错误的,闭包无处不在,有时候我们需要去避免,有时候需要去利用;

那么就从一个经典的例子开始:

<div class="wrap">
    <button>click</button>
    <button>click</button>
    <button>click</button>
    <button>click</button>
</div>
<script type = 'text/javascript'>
    var btns = $('button');
    for(var i=0;i<btns.length;i++) {
        btns[i].onclick = function set(){
            console.log(i);
        };
    }
</script>    

本来想着,按几输出几的下标,写完出来,完全不是


效果

当时,我的理解就是:外面的循环太快,导致里面绑定还没来得及,等去赋值的时候,i已经冲到了4,于是乎就变成了都输出4;
现在想想,要真是这样,btns[i]这个onclick那就绑定到4上去了,根本就没有btns[4],绑定毛线;

现在弄清楚了,在绑定的时候,确实i是跟着for循环再一个一个绑定,但是绑定的事件根本都没触发,里面的btns[i]根本没去要i的值,给btns[0]~btns[3]绑定的只是光秃秃的console.log(i),最后触发的时候,i已经变成了4,故就变成了上面这个样子;

相比上次,对原因一知半解甚至还有错的,现在理解稍微深刻一点了,这次知道如何修复,达成目的:

    var btns = $('button');
    for(var i=0;i<btns.length;i++) {
        bind(i);
    }
    function bind(num){
        btns[num].onclick = function set(){
        console.log(num);
        };
    }

这个是用闭包解决了,分别创建不同的闭包,并且每个相互不影响,来马上保存记录当时的数字;

当然现在还有一个另外的方法,关键是一个马上保存,并且保存下来相互不干扰;

    var btns = $('button');

    for(var i=0;i<btns.length;i++) {
        btns[i].val = i;
        btns[i].onclick = function () {
            console.log(this.val);
        };
    }

将i绑定到每个按钮身上,并且利用前几天接给我带来烦恼的this;


修复
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容