javascript基础八(知识点类闭包)

来源:互联网 发布:淘宝太坑了女主角 编辑:程序博客网 时间:2024/06/12 00:11

/** * 一:什么是闭包 * 1:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回 * 例一: *  * 二:闭包有什么好处 * 1:希望变量长期驻扎在内存中 * 2:避免全局变量的污染 例二 * 3:私有成员的存在 * * 用法: * 1:代码模块化  例三 * 2:可以在循环中直接找到对应元素的索引(例四) *  * 三:闭包需要注意的地方 * 在ie下会引发内存泄露 (关于内存泄露问题,文章底部) */// 例一start:function aaa(a){var b = 5;function bbb(){alert(a);alert(b);}}aaa() //当函数执行后变量不会被垃圾回收机制所收回,因为在函数内部所调用// js中的垃圾回收机制function ccc(){var a = 1;}ccc();  //当函数执行后变量就会被js中的垃圾回收机制所收回// 例一end:// // 例二start:var a =1;function ddd(){a ++;alert(a);}ddd();//2ddd();//3alert(a) //3function eee(){var  a = 1;a ++;alert(a);}eee();//2eee();//2// 那么怎么可以做到,让a即是局部变量,又可以叠加:so:闭包function aaa(){var a = 1;return function bbb(){a++;alert(a);}}var b = aaa();b() //2b() //3alert(a)//报错// 例二end:// 例三startvar aaa = (function(){var a = 1;function bbb(){a ++;alert(a);}function ccc(){a ++;alert(a);}return {b : bbb,c : ccc}})();aaa.b();aaa.c();// 例三end// 例四startfor(var i=0;i<oLi.length;i++){(function(i){oLi[i].onclick = function(){alert(i);}})(i)}//或者for(var i=0;i<oLi.length;i++){oLi.onclick = (function(i){return function(){alert(i);}}(i))}// 例四end
IE中内存泄露的几种方式:


1、循环引用(Circular References) — IE浏览器的COM组件产生的对象实例和网页脚本引擎产生的对象实例相互引用,就会造成内存泄漏。这也是Web页面中我们遇到的最常见和主要的泄漏方式;

2、内部函数引用(Closures) — Closures可以看成是目前引起大量问题的循环应用的一种特殊形式。由于依赖指定的关键字和语法结构,Closures调用是比较容易被我们发现的;

3、页面交叉泄漏(Cross-Page Leaks) — 页面交叉泄漏其实是一种较小的泄漏,它通常在你浏览过程中,由于内部对象薄计引起。下面我们会讨论DOM插入顺序的问题,在那个示例中你会发现只需要改动少量的代码,我们就可以避免对象薄计对对象构建带来的影响;

4、貌似泄漏(Pseudo-Leaks) — 这个不是真正的意义上的泄漏,不过如果你不了解它,你可能会在你的可用内存资源变得越来越少的时候极度郁闷。为了演示这个问题,我们将通过重写Script元素中的内容来引发大量内存的"泄漏"。

参考:http://www.cnblogs.com/meteoric_cry/archive/2010/09/14/1825951.html

0 0
原创粉丝点击