闭包:具有作用域的代码块就是闭包
闭包的好处:可以通过业务点对闭包做区分
1.函数内部的变量外部是无法访问的,但是可以通过返回一个闭包,外部操作闭包来间接访问函数内部的变量,闭包可以决定这个变量的操作方式
2.利用了函数每次调用时生成的独立调用栈,利用函数的形参保存临时变量的值(比如for循环内部如果有延时获取变量i的情况,因为for不具有作用域,i取值不真实,然后就可以采用闭包这个方法)
3.利用函数的独立作用域,来生成业务代码块(把业务代码用函数封装起来,形成业务代码块),内部的变量相互不冲突污染全局变量(就是自调用不会影响全局)
4.可以把一个闭包封装到原型中,这样每一个对象都可以共用闭包工具
5.回调函数,利用函数复用的功能,制作复用工具,参数返回值
代码:
<script type="text/javascript">
//使用money
function fn(){
var money=1000
function fm(){
money-=20
}
return fm
}
function a(){
var b=fn()
b()
}
a()
</script>
代码(可以解决函数失真的问题):
<script type="text/javascript">
//解决函数失真的问题
function tool(index){
arr[index]=function fn(){
console.log(index)
}
}
var arr=[]
for(var i=0;i<5;i++){
tool(i)
}
arr[2]()
//相当于
var arr=[]
for(var i=0;i<5;i++){
//自调用
(function(index){
arr[index]=function fn(){
console.log(index)
}
})(i)
}
arr[2]()
</script>
代码(回调函数):
<script type="text/javascript">
function fn(arg1){
var data="hello"
arg1(data)
}
fn(function(a){
console.log(a,123)
})
</script>
回调函数:
<script type="text/javascript">
function fn(arg){
var b=100;
arg(b)
}
function fm(c){
console.log(123,c);
var a=20;
}
fn(fm)
</script>