// 闭包缺点
// 返回函数 导致函数被引用
// 函数被引用会导致 内存不释放 内存泄漏
// 解决方式: 利用标记清除法:做到零引用,垃圾回收机制会自动回收
// 赋值为 null 不占内存,会被自动回收
// 优点 1.防止变量污染 2.函数内部变量可以被函数外部访问(形式上)
// MDN 闭包定义
// 闭包指的是能被访问的自由变量的函数
// 闭包两个条件 1.函数 2.存在自由变量被访问
// 什么是自由变量?
// 自由变量指的是: 在函数中使用,既不是函数的参数,也不是函数的局部变量的变量
// 结论: 闭包由两部分组成
// 闭包 = 函数 + 函数能够访问的自由变量
function foo(){
var count=0;
return function(){
console.log(++count);
}
}
var res = foo();
var res1 = foo()
res();
res1();
// a变量被 foo 函数访问
// a 既不是foo 的局部变量,也不是 foo 的参数
// 所以 a是自由变量
// res 和 res1 是两个彼此独立的闭包,互不干扰
使用立即执行函数
// 没有函数提升
(function(dec,go){
console.log(window);
// 使用全局作用域下的window
console.log(go);
// 使用当前作用域下,window,实现私有化
console.log(dec);
console.log('立即执行函数');
}('我是实参',window))
// 使用立即执行函数 解决闭包内存泄漏问题
// 立即执行函数,在浏览器加载时候执行,执行时会创建变量
// 并赋值,虽然res a b c 是闭包,执行完毕时变量会销毁
// res a b c 销毁 ,所以解决内存泄漏问题
(function(global){
var count = 0;
function bar(){
console.log(++count);
}
}(window))