闭包的概念:在一个作用域里调用另外一个作用域的局部变量
闭包的作用:扩大局部变量的使用范围
闭包的缺点:使用过多可能会造成内存的泄露,因为原来函数内部的变量使用完后就应该被销毁,释放内存,但是由于闭包里的函数还得要继续使用某一些变量,所以这些变量不会被销毁,闭包使用过多的话就会导致内存的泄露了
总结:闭包不一定是好的,使用前要考虑好是否有必要使用闭包
一个经典案例
<ul class="nav">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
</ul>
<script>
// 目的点击li输出当前li的索引号
var lis = document.querySelector('.nav').querySelectorAll('li');
// 利用闭包的方式得到当前小li 的索引号
for (var i = 0; i < lis.length; i++) {
// 利用for循环创建了4个立即执行函数
// 立即执行函数也成为小闭包因为立即执行函数里面的任何一个函数都可以使用它的i这变量
(function(i) { //接受i
lis[i].onclick = function() { //给当前i的li添加点击事件
console.log(i); 由于当前再立即执行函数中,所以会立即把i存放在这个输出语句中,而不会再把循环结束后的i传进来
}
})(i); //把当前的i传进去当索引号
}
</script>
递归函数
就是在一个函数内部调用自己这个函数,一般用来做深层遍历
一个经典的案例:
<script>
var data = [{
id: 1,
name: '家电',
goods: [{
id: 11,
gname: '冰箱',
goods: [{
id: 111,
gname: '海尔'
}, {
id: 112,
gname: '美的'
},]
}, {
id: 12,
gname: '洗衣机'
}]
}, {
id: 2,
name: '服饰'
}];
function getDate(arr, id) { //调用这个函数,返回你传进来id所对应的对象
var a = {};
arr.forEach(function(value) { //使用forEach来遍历数组,进行查找数据,当然这里使用for循环也挺方便
if(value.id == id){ //判断是否是你所想要的id数据
a=value; //是的话就将value存在a中,下面再返回出去
}else if(value.goods && value.goods.length > 0){
a= getDate(value.goods, id); //调用自身,来进行深层遍历,把得到的返回对象再放在这个a中,下面再返回
}
});
return a; //不管是第一层遍历还是第几层遍历,只要找到了,都会有个值返回
}
console.log(getDate(data, 1));
console.log(getDate(data,11));
console.log(getDate(data,111));
console.log(getDate(data,12));
console.log(getDate(data,2));
</script>