闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰。直观的说就是形成一个不销毁的栈环境。(这个是菜鸟教程里的)
想要理解闭包,我们先来一个没有闭包引发的问题:
<body>
<input type="button" value="1"/>
<input type="button" value="2"/>
<input type="button" value="3"/>
</body>
<script>
//获取所以input
var btns = document.getElementsByTagName('input');
//遍历input
for(var i = 0;i < btns.length;i++){
//一个一个绑定点击事件
btns[i].addEventListener('click',function(){
//打印i
console.log(i);
});
}
</script>
运行结果:
发现不管点击那个input打印的 i 都是3,因为遍历结束后 i 的值就为3,所以打印的就是3,但是我们想要打印的 i 是input的索引,也就是第几个input?
此时就可以使用闭包了,闭包里的变量是私有的,不会受到外界的干扰,如下:
<body>
<input type="button" value="1"/>
<input type="button" value="2"/>
<input type="button" value="3"/>
</body>
<script>
var btns = document.getElementsByTagName('input');
//上面的代码是一样的
//遍历
for(var i = 0;i < btns.length;i++){
//这里就使用闭包了,格式(function(){})()
//闭包里的function(){}会自动执行,每次循环都会执行
(function(i){//i是形参
//可以理解为:每次循环都形成一个变量i,该变量只属于该闭包专属的值
//使用i来绑定点击事件
btns[i].addEventListener('click',function(){
//此时打印的i是属于该闭包的专属值
console.log(i);
});
})(i)
}
</script>
运行结果:
总结:使用闭包来形成私有的作用域,让变量的值不会随便被改变