闭包的使用以及应用场景以及垃圾回收机制

时间:2022-11-25 15:19:50

闭包的使用以及应用场景以及垃圾回收机制闭包的应用场景

闭包文章一

闭包文章二

//关于闭包  循环点击,只输出最后一个i的问题,暂时不解释
			//闭包:内部函数可以调用外部函数的参数,并且内部函数是在外部函数作用域之外执行的。

			function fn1() {
				var _n = 1;
				return _n++;
			}
			console.log(fn1()); //1  虽然也能获取函数内部变量_n但是不是闭包。内部变量_n释放
			console.log(fn1()); //1

			function fn2() {
				var _n = 1;
				return function() {
					return _n++;
				}
			}
			console.log(fn2()()); //1 虽然也能获取函数内部变量_n但是不是闭包。
			var fnn2 = fn2(); //获取一个返回函数  只要还是这个返回函数调用,函数fn2里面的内存不会释放 
			//达到同一个fnn2 内部数据共享  访问修改私有状态
			console.log(fnn2()) //1
			console.log(fnn2()) //2
			console.log(fnn2()) //3
			console.log(fnn2()) //4
			var fnn22 = fn2(); //又重新获取一个返回函数,仍然从1开始累积计算
			console.log(fnn22()) //1  
			//以上方法类似java  实体类   内部变量是私有的,外部无法访问,通过get  set 获取设置
			//Person p1 = new Person();对象属性共享
			//Person p2 = new Person();重新创建一个新对象
			//public class Person {
			//	private String name;
			//	private String age;
			//	private String sex;
			//	public String getName() {
			//		return name;
			//	}
			//	public void setName(String name) {
			//		this.name = name;
			//	}
			//	public String getAge() {
			//		return age;
			//	}
			//	public void setAge(String age) {
			//		this.age = age;
			//	}
			//	public String getSex() {
			//		return sex;
			//	}
			//	public void setSex(String sex) {
			//		this.sex = sex;
			//	}
			//	public String toString() {
			//		return "年龄" + this.age + "姓名" + this.name;
			//	}
			//}
			
			//闭包模块 写法
			var cFn = (function(){
				var num = 1;
				function set(n){
					num = n;
				}
				function get(){
					return num;
				}
				return {
					set:set,
					get:get
				}
			})();
			console.log(cFn.get())//1
			cFn.set('a');
			console.log(cFn.get())//变成了a   可以改变和访问内部变量

			function foo(params) {

			} 
			{
				let sd = {};
				foo(sd);
			}
			var btn = document.getElementById("id");
			btn.addEventListener("click", function(e) {
				console.error(e)//形成一个闭包,因为有可能调用全局变量 所以会导致全局变量不释放
				//全局变量不释放,占用内存:解决方式----减少全局变量,多用块级作用域
				//比如:上面的let ss = {};foo(sd)如果没有{}包裹,那么执行完函数,变量sd可能会依然保存
			})