js高级_112、常见闭包

将函数作为另一个函数的返回值

function fn1(){
		var a=2;
		function fn2(){//执行函数定义就会产生闭包,执行函数定义不是指调用函数。
			a++;
			console.log(a);
		}
		return fn2;
	}
	
	var f=fn1();
	f();//3
	f();//4

它是调的fn1,但是fn1它的返回的是fn2,所以它这个f里面实际上是保存的是fn2的函数的引用。相当于f是fn2函数的实例。所以这个fn2函数的上下文对象里面的a是等于2的,每调用一次它就加一次,只有重新调用外部函数fn1的时候才会重新产生一个闭包,重新产生一个fn2的函数上下文对象,里面的a才会重置。但是这两个调用fn1方法所接收的fn2是两个独立的闭包。

上面只产生了1个闭包。
怎么看闭包产生了几个?看外部函数被执行了几次。

闭包什么时候产生?
外部函数对象被调用时候产生。内部嵌套的闭包函数被调用是不会产生新的闭包的。

闭包产生之后,外部函数执行完了,被引用的对象不会消亡,因为它赋值给了一个变量,相当于闭包这个空间的引用也给了这个变量了。,如果没有闭包,就访问不了里面的a了。

将函数作为实参传递给另一个函数调用。

function showDelay(msg,time){
	
	setTimeout(function(){
		console.log(msg);
	},time)
	
}

showDelay("hello",2000);
posted @ 2022-03-14 17:43  青仙  阅读(82)  评论(0编辑  收藏  举报