关闭

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

288人阅读 评论(0) 收藏 举报
分类:

/**
 * 一:什么是闭包
 * 	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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:57051次
    • 积分:1229
    • 等级:
    • 排名:千里之外
    • 原创:64篇
    • 转载:25篇
    • 译文:1篇
    • 评论:8条
    文章分类
    最新评论