闭包浅析
什么是闭包
官方的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
简单来说:js中所有的函数都是一个闭包。不过一般来说,嵌套的函数所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。
闭包的特点
1. 作为一个函数变量的一个引用,当函数返回时,其处于激活状态。
2. 一个闭包就是当一个函数返回时,一个没有释放资源的栈区。
变量的作用域
要理解闭包首先需要先理解变量的作用域
变量的作用域包括全局变量和局部变量两种
全局变量:
<script> var k=3; function f1(){ alert(k) } f1();//3 </script>
这里的k属于全局变量在函数内部能使用k这个变量
局部变量:
<script> function f1(){ var k=3; } alert(k)//k is not defined </script>
这里的k就属于局部变量在f1()函数外是取不到k的值的 当然这里的k前面有var声明 如果前面没有var提前声明的话 他就变成了一个全局变量
<script> function f1(){ k=3; } f1(); alert(k)//3 </script>
下面看一个例子
<script> function f1(){ n=3; function f2(){ alert(n); } } f2();//f2 is not defined </script>
上面的代码是错误的 f2()的作用域在函数f1()的内部 所以在f1()的函数外部调用f2()是错误的 在这里想要在f1()外部调用f2()里面的内容 就需要用到下面的代码 也就是闭包
<script> function f1(){ n=3; function f2(){ alert(n); } return f2();//注意 } f1();//3 </script>
什么是闭包:当内部函数在他的作用域外的地方被引用时,就是闭包;
闭包缺点:常驻内存会增大内存使用量,使用不当很容易造成内存泄露。例如:当内部函数f2()用到f1()的变量n 当f1()执行完毕后 n不会被释放 因为f2()需要用到n
如有错误 请指出 谢谢!