1.什么是闭包?
闭包就是一个有作用域的代码块,比如一个全局函数或者一个事件的监听器或者一个回调函数或者一个函数内部返回值的函数都可以算是闭包
2.闭包的作用
(1) 可以读取函数内部的变量
(2) 可以把变量始终保存在内存中 闭包的写法 1 一个函数(即外部函数)里面包含另一个函数(即内部函数),并且return返回这个内部函数, 然后内部函数在定义内部函数之外的作用域被调用,这时的内部函数就是一个闭包了。
(3) 内部函数引用了外部函数的变量,这个变量不会被销毁,因为闭包需要这个变量, 所以通过闭包可以访问闭包保存的变量 function foo(){ var n = 1; function innerFoo(){ n += 1; console.log(n); } return innerFoo; } var func = foo(); func(); // 2, 产生闭包innerFoo(),变量n保存在内存中 func();
3.闭包的一些使用场景和用途
(1)我们团队开发时 常常会写很多变量名 可能会出现变量重名导致业务冲突 为了解决这个问题可以使用闭包,利用闭包是一个有作用域的功能来,把每一个业务的代码写在闭包中 变量声明在闭包内部 解决全局变量冲突问题
如下示例:
<script>
(function() {
var a=200
a=a-10
})();
(function () {
var a="标题"
a.fontcolor("red")
})()
</script>
(2)有时候代码块没有作用域 我们有一些频繁改变的变量,不能记录下它变化过程中的值,就可以使用闭包,函数内部每一次调用都会生成一个独立的AO对象
把var 改为let 在ES6中 let 所在的代码块 具体隐式作用域
(3)一个函数内部,如果有一些变量希望外部访问,但是不想外部直接操作:比如支付宝的余额 美团外卖想修改 那么就可以让这个函数返回一个闭包,让这个闭包来操作这个函数内部的变量
如下通过调用aliplay方法中的tool方法可以间接的改变rest的值,而外部并不能直接修改rest值
<script>
function alipay () {
var money={rest:1000}
function tool (n) {
money.rest-=n
return tool
}
return tool
}
</script>
3.闭包的一些弊端及问题
(1) 因为闭包的变量保存在内存中,内存泄漏,对内存的消耗很大,所以不要滥用闭包 闭包常用的地方: 1 es5 for循环事件监听 2 函数里使用了定时器 3 封装许多高级的功能集 减少闭包使用可以用立即执行函数传递变量
(2)闭包会让我们代码变得复杂且难以维护
如果遇到了这种情况,可以换技术实现