闭包
闭包是一种特殊的对象。它由两部分组成:
- 执行上下文(A)
- 在该执行上下文中创建的函数(B)
当B执行时,如果访问了A中变量对象的值,那么闭包就会产生。
如上一篇文章中的题目。
1 <script>
2 //debugger;
3 var i=5;
4 function fn(i){
5 return function(n){
6 console.log(n+(++i));
7 }
8 }
9 var f=fn(1);
10 f(2);
11 fn(3)(4);
12 fn(5)(6);
13 f(7);
14 console.log(i);
15 </script>
上面的例子中,第九行时创建了一个执行上下文fn()。在fn()中返回了一个函数的地址赋值给f,在后续又对f()进行了调用。并且访问了fn()中i的值,所以就形成了闭包。在js中,函数的执行上下文会在执行完毕之后生命周期结束被销毁,但是闭包的存在会阻止这一过程。
在上面的例子中,fn(1)执行完毕之后,按照一般规律来说,会出栈销毁。但是通过 f()=fn(1)返回的函数地址 这一引用被保留了下来,而且fn(1)的变量对象也被保留了下来。一个不被销毁的栈,我们称之为闭包。通过闭包,我们可以在其他执行上下文中访问到函数内部的变量。
闭包的应用