闭包

来源:互联网 发布:淘宝店铺详情页模板 编辑:程序博客网 时间:2024/04/30 09:46
1.闭包的含义
匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数。
具体定义:闭包是指有权访问另一个函数作用域中的变量的函数 , 创建闭包的常见的方式 , 就是在函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量。
function box () {
     return function () {
          return 'Lee';
     }
}
box()();
表达式自我执行: () 表示执行函数,并且传参
函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
Javascript语言特有的“链式作用域”结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

2.闭包的好处和弊端
使用闭包有一个优点 , 也是它的缺点 : 就是可以把局部变量驻留在内存中 , 可以避免使全局变量。 ( 全局变量污染导致应用程序不可预测性,每个模块都可调用必将引来灾难,推荐使用私有的,封装的局部变量 ) 。
PS :由于闭包里作用域返回的局部变量资源不会被立刻销毁回收,所以可能会占用更多的内存。过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包。
作用域链的机制导致一个问题,在循环中里的匿名函数取得的任何变量都是最后一个,除非让闭包知我自行。
关于 this 对象
在闭包中使用 this 对象也可能会导致一些问题 , this 对象是在运行时基于函数的执行环境绑定的,如果 this 在全局范围就是 window ,如果在对象内部就指向这个对象。而闭包却在运行时指向 window 的,因为闭包并不属于这个对象的属性或方法。

内存泄漏
由于 IE 的 JScript 对象和 DOM 对象使用不同的垃圾收集方式 , 因此闭包在 IE 中会导致一些问题 。 就是内存泄漏的问题 , 也就是无法销毁驻留在内存中的元素 。


3.模仿块级作用域
使用了块级作用域 ( 私有作用域 ) 后 , 匿名函数中定义的任何变量 , 都会在执行结束时被销毁 。 这种技术经常在全局作用域中被用在函数外部 , 从而限制向全局作用域中添加过多的变量和函数 。 一般来说 , 我们都应该尽可能少向全局作用域中添加变量和函数 。 在大型项目中,多人开发的时候,过多的全局变量和函数很容易导致命名冲突,引起灾难性的后果 。 如果采用块级作用域 ( 私有作用域 ) , 每个开发者既可以使用自己的变量 , 又不必担心搞乱全局作用域。
在全局作用域中使用块级作用域可以减少闭包占用的内存问题 , 因为没有指向匿名函数的引用。只要函数执行完毕,就可以立即销毁其作用域链了。
var luMap = function(){
     //私有地图对象
     var map;
     //私有注点
     var marker;
     //私有方法
     function run(){
          return "测试...";
     }
     //对外接口提供方法
     var obj = {
          initMap:function(mapId){
               map = new BMap.Map(mapId);
               var point = new BMap.Point(116.404, 39.915);  // 创建点坐标
               map.centerAndZoom(point, 15);                 // 初始化地图,设置中心点坐标和地图级别
          },
          addMarker:function(){
               marker = new BMap.Marker(new BMap.Point(116.404, 39.915));
               map.addOverlay(marker);
          }
     };
     return obj;
}();
luMap.initMap("container");  //加载地图
luMap.addMarker();           //加载点
0 0