您的位置:首页 > Web前端 > JavaScript

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

2015-07-08 14:17 471 查看
/**
* 一:什么是闭包
* 	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();	//2
ddd();	//3
alert(a) //3

function eee(){
var  a = 1;
a ++;
alert(a);
}
eee();	//2
eee();	//2
// 那么怎么可以做到,让a即是局部变量,又可以叠加:so:闭包
function aaa(){
var a = 1;
return function bbb(){
a++;
alert(a);
}
}
var b = aaa();
b() 	//2
b() 	//3
alert(a)//报错
// 例二end:
// 例三start
var 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

// 例四start
for(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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: