第一次接触闭包,是在一个小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;