JS闭包、回调函数

502 阅读1分钟

闭包:具有作用域的代码块就是闭包

闭包的好处:可以通过业务点对闭包做区分

 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>