闭包的应用场景
闭包文章一
闭包文章二
//关于闭包 循环点击,只输出最后一个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可能会依然保存
})