定义:
函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。
思考:
JS语言是没有块级作用域的,只有函数作用域。当函数内部访问变量时,会先在自己的内部作用域里去寻找,直至没有,然后就会不停向更外层的作用域去寻找,找到则停止,没找到则继续找,直到全局作用域里。(关于为什么是这样,这个要联系堆栈的知识)。这样一来,还有一个好处,就是内部函数的变量,外部的函数和全局作用域里的变量访问不到,不会造成变量污染全局环境。
应用:
1.递归时使用闭包
function func (num) {
if (num<=1) {
return 1;
}
return num * func(num-1);
}
核心:递归调用函数(当前项目中不提倡递归,不易排查问题以及代码可阅读性不高,一般使用队列或栈代替)
2.模仿块级作用域
(function () {
for(var i=0;i<10;i++){
console.log(i);
}
})()
alert(i);//这时打出的i是undefined,证明闭包能模拟块级作用域
3.循环给dom绑定事件的时候,获取index去打印
坑:
1.内存泄漏。比如要为某个元素添加onclick事