`
xiaomiya
  • 浏览: 127725 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

知识点温故而知新

 

提到闭包,我们就会问到这几个问题:

1,什么是闭包,

2,闭包有什么好处?应用在哪里?

3,闭包需要注意的地方?

下面我们就一一来解释这几点。

 

1,概念:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回。

 

//闭包的写法,,不回收
function aaa(a){
	var b=5;
	function bbb(){
		alert(a);
		alert(b);
	}
}

function aaa(){
	var a = 5;
	function bbb(){
		alert(a);
	}
	return bbb;
}
var c = aaa();
c();//弹出5

//js中的垃圾回收机制
function aaa(){
	var a=1;
}
aaa();//这一步的时候var a=1已经被收回。

2,好处:希望一个变量长期驻扎在内存当中,避免全局变量的污染

var a = 1;
function aaa(){
	a++;
	alert(a);
}
aaa();//2
aaa();//3
或者
alert(a);//1

 局部变量

function aaa(){
	var a = 1;
	a++;
	alert(a);
}
aaa();//2
aaa();//2

 即是局部变量又可以累加:

function aaa(){
	var a = 1;
	return function(){
		a++;
		alert(a);
	}
}
var b = aaa();
b();//2
b();//3
alert(a);//报错找不到a

 

function aaa(){
	alert(1);
}
aaa();//一般的函数申明和调用

(function(){
	alert(1);
})();//函数()() 函数声明变成函数表达式就可以立马执行,调用。。

 

私有成员方法,避免全局函数污染,,模块化代码

var aaa = (function(){
	var a = 1;
	return function(){
		a++;
		alert(a);
	}
})();
aaa();//2
aaa();//3
alert(a);//找不到

 函数怎么变私有的,用法:模块化代码模型

var aaa = (function(){
	var a = 1;
	function bbb(){
		a++;
		alert(a);
	}
	function bbb(){
		a++;
		alert(a);

	}
	function ccc(){
		a++;
		alert(a);
	}
		return{
		b:bbb,
		c:ccc
	}
})();
aaa.b();//2
aaa.c();//3
//alert(a);//找不到
//alert(bbb);//找不到
//alert(ccc);//找不到

 用法:在循环中直接找到对应元素的索引,

<ul>
	<li>aaaaaaaa</li>
	<li>bbbbbbbb</li>
	<li>cccccccc</li>
</ul>

 每个li添加点击事件看看获取的索引值

一般可能会写成这样的,,
window.onload = function(){
	var aLi = document.getElementsByTagName("li");
	for(var i=0; i<aLi.length; i++){//这个for循环执行结束的时候才执行onclick所以每次弹出都是3

            aLi[i].onclick = function(){
			alert(i);
	    };

	}
};//点击每一个弹出来都是3.  我们利用闭包来改写。
因为闭包是:内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制所收回。
所以我们可以把012传进去,想用的时候用
window.onload = function(){
	var aLi = document.getElementsByTagName("li");
	for(var i=0; i<aLi.length; i++){

		(function(i){
			aLi[i].onclick = function(){
						alert(i);
					};
		})(i);
		

	}
};

另一种方法
window.onload = function(){
	var aLi = document.getElementsByTagName("li");
	for(var i=0; i<aLi.length; i++){//
		
			aLi[i].onclick = (function(i){
				return function(){
					alert(i);
				}
			})(i);
		

	}
};

 3,闭包需要注意的就是ie下会引发内存泄漏:当你页面跳转的时候你的变量不会被释放一直存在你的内存当中,使你的cpu累加,。。只有浏览器关闭的时候才会被释放。

看一下怎么才会内存泄漏

<div id="div1">aaa</div>

 

window.onload = function(){
	var oDiv = document.getElementById("div1");

	oDiv.onclick = function(){
		alert(oDiv.id);
	};

这样的写法会导致内存泄漏。也就是满足内存泄漏的条件:就是当一个变量,这个变量是获取一个DOM节点或者是数组对象的时候,他的一个属性如onclick,去引用一个内部函数,,内部函数的变量又是引用外部对象的时候。

 这样的情况下怎么去解决呢。

window.onload = function(){
	var oDiv = document.getElementById("div1");

	oDiv.onclick = function(){
		alert(oDiv.id);
	};
//1,
window.onunload = function(){
	oDiv.onclick = unll;
}    
};
//2,方法
window.onload = function(){
	var oDiv = document.getElementById("div1");
	var id = oDiv.id;
	oDiv.onclick = function(){
		alert(oDiv.id);
	};
	oDiv = null;
};

 

 

 

分享到:
评论

相关推荐

    自己理解的关于闭包函数

    自己理解闭包函数

    【JavaScript源代码】详细聊聊浏览器是如何看闭包的.docx

    今天打算换个角度来理解闭包,从内存分配与回收的角度阐述,希望能帮助你真正消化掉所看到的闭包知识,同时也希望本文是你看的最后一篇关于闭包的文章。 大家看本文中的配图时,请牢记箭头的指向。因为它是根

    JAVASCRIPT闭包详解

    所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些... 关于闭包,最 简单的描述就是 ECMAScript 允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包

    离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...

    分享一道关于闭包、bind和this的面试题

    主要给大家介绍了一道关于闭包bind、this的面试题,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。

    Java闭包 Java闭包

    JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...

    数据库求属性集闭包&函数依赖闭包

    3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...

    微信小程序闭包问题引发的JS闭包解决方案

    对于前端同学无论在面试还是在开发,都逃不过关于闭包的问题。最近小程序项目中遇到变量访问权限的问题一时间没考虑到闭包,郁闷了,在此感谢@Topqiang给我指点。本文阅读一遍不一定能够理解掌握,需要反复推敲和...

    关系闭包的计算

    实验目的:熟悉warshall算法,掌握求关系的自反闭包,对称闭包和传递闭包的方法。 实验内容:从键盘输入一个关系的关系矩阵,自动求出自反闭包、对称闭包和传递闭包。 计算传递闭包用Warshall算法。 #include...

    C语言实现三种闭包算法(传递,自反,对称闭包)

    C语言实现三种闭包算法,能够实现传递,自反,对称闭包

    内存泄露,闭包 内存泄露,闭包 内存泄露,闭包

    内存泄露,闭包 内存泄露,闭包 内存泄露,闭包

    对Python闭包与延迟绑定的方法详解

    Python闭包可能会在面试或者是工作中经常碰到,而提到Python的延迟绑定,肯定就离不开闭包的理解,今天总结下 关于闭包的概念以及一个延迟绑定的面试题。 Python闭包 1、什么是闭包,闭包必须满足以下3个条件: 必须...

    python闭包与引用以及需要注意的陷阱

    关于闭包, 很多blog中都这样解释 :对于一个嵌套定义的函数,外层的函数的返回值是内层函数,而在内层函数中又引用了外层函数的局部变量,在外层函数执行后,其局部变量并非被回收,而会同返回的内层函数一同存在,...

    浅谈js 闭包引起的内存泄露问题

    关于闭包还有没有类似的内存或效率问题需要注意?如何去规避? 内存问题可能是如下原因造成: 1. 循环引用导致了内存泄漏 2. 由外部函数调用引起的内存泄漏 避免内存泄漏 1. 打破循环引用 2. 添加另一个闭包 3. 避免...

    计算NFA中ε闭包

    计算NFA中各个状态的闭包,从键盘上输入一个NFA的描述信息(输入格式自行定义),将 该NFA的描述信息保存到合适的数据结构中,然后计算出NFA中每个状态的ε_closure。

    JavaScript闭包函数

    闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...

    JS匿名函数、闭包

    但是,当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止;使用闭包可以在JavaScript中模仿块级作用域(JavaScript本身没有块级作用域的概念),要点如下: 创建并立即调用一个函数...

    C++对称闭包对称闭包

    用矩阵求对称闭包。简洁,轻松学习,相互交流。

    JS闭包可被利用的常见场景

    JS闭包可被利用的常见场景。值得保留的文档。值得一看

    Swift之闭包ClosureDemo

    Swift之闭包ClosureDemo

Global site tag (gtag.js) - Google Analytics