闭包
是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量
闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
闭包是javascript
语言的一大特点,主要应用闭包场合主要是为了:设计私有的方法和变量。
一般函数执行完毕后,局部活动对象就被销毁,内存中仅仅保存全局作用域。但闭包的情况不同!
再简便点就是:
闭包实际上就是沟通外部函数和内部函数之间的一个桥梁,通过对函数的返回,实现函数外部的对象调用函数内部的变量、方法等。
了解闭包之前我们先通过两个例题来看一下函数作用域和预解析过程:
//1 function fn(){ var i=0; var fn1=function(){ console.log(i); }; i++; var fn2= function () { console.log(i); }; return [fn1,fn2]; } var arr=fn();//i已经等于1了,这会只能确定i的作用域是fn里的i arr[0]();// 1 这会才开始调用fn1,调用的时候i已经等于1了 arr[1]();// 1 这会才开始调用fn2,调用的时候i已经等于1了
看完想必你也明白了,那我们再来说下闭包问题:(拿下面这个闭包函数举例子)
//2 function ff(){ var i=0; //return function(){}实现闭包 return function(){ return ++i; } } var f1=ff();//0 //ff();形成了闭包环境,所以保存在上下文的数据不会销毁,因为return function(){}里面i的引用指向ff下的i变量 //执行一次调用一次,但是i的值没有销毁,因为return function对ff()有依赖 console.log(f1());//1 console.log(f1());//2 console.log(f1());//3
再总结下闭包:
1.局部变量在韩顺执行完成后未被销毁,因为这个局部变量对外部有依赖.
**函数在声明的时候就已经确定了自由变量的作用域**
2.闭包就是为了延长变量的作用域;