知识点温故而知新
提到闭包,我们就会问到这几个问题:
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;
};
相关推荐
自己理解闭包函数
今天打算换个角度来理解闭包,从内存分配与回收的角度阐述,希望能帮助你真正消化掉所看到的闭包知识,同时也希望本文是你看的最后一篇关于闭包的文章。 大家看本文中的配图时,请牢记箭头的指向。因为它是根
所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些... 关于闭包,最 简单的描述就是 ECMAScript 允许使用内部函数--即函数定义和函数表达式位于另一个函数的函数体内
离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包,传递闭包 离散数学-关系,集合,求自反闭包,对称闭包...
主要给大家介绍了一道关于闭包bind、this的面试题,文中给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧。
JSR-335 将闭包引入了 Java 。闭包在现在的很多流行的语言中都存在,例如 C++、C# 。闭包允许我 们创建函数指针,并把它们作为参数传递。在这篇文章中,将粗略的看一遍Java8的特性,并介绍 Lambda表达式。而且将试...
3) 计算属性集闭包的算法,在课件里有详细说明。方法很简单,但用文字描述很抽象。。。。不解释。。。 4) 计算函数依赖的闭包。此步骤不作要求,但要会方法。个人总结:将所有属性元素组成一个集合(域)记为R;...
对于前端同学无论在面试还是在开发,都逃不过关于闭包的问题。最近小程序项目中遇到变量访问权限的问题一时间没考虑到闭包,郁闷了,在此感谢@Topqiang给我指点。本文阅读一遍不一定能够理解掌握,需要反复推敲和...
实验目的:熟悉warshall算法,掌握求关系的自反闭包,对称闭包和传递闭包的方法。 实验内容:从键盘输入一个关系的关系矩阵,自动求出自反闭包、对称闭包和传递闭包。 计算传递闭包用Warshall算法。 #include...
C语言实现三种闭包算法,能够实现传递,自反,对称闭包
内存泄露,闭包 内存泄露,闭包 内存泄露,闭包
Python闭包可能会在面试或者是工作中经常碰到,而提到Python的延迟绑定,肯定就离不开闭包的理解,今天总结下 关于闭包的概念以及一个延迟绑定的面试题。 Python闭包 1、什么是闭包,闭包必须满足以下3个条件: 必须...
关于闭包, 很多blog中都这样解释 :对于一个嵌套定义的函数,外层的函数的返回值是内层函数,而在内层函数中又引用了外层函数的局部变量,在外层函数执行后,其局部变量并非被回收,而会同返回的内层函数一同存在,...
关于闭包还有没有类似的内存或效率问题需要注意?如何去规避? 内存问题可能是如下原因造成: 1. 循环引用导致了内存泄漏 2. 由外部函数调用引起的内存泄漏 避免内存泄漏 1. 打破循环引用 2. 添加另一个闭包 3. 避免...
计算NFA中各个状态的闭包,从键盘上输入一个NFA的描述信息(输入格式自行定义),将 该NFA的描述信息保存到合适的数据结构中,然后计算出NFA中每个状态的ε_closure。
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
但是,当函数返回了一个闭包时,这个函数的作用域将会一直在内存中保存到闭包不存在为止;使用闭包可以在JavaScript中模仿块级作用域(JavaScript本身没有块级作用域的概念),要点如下: 创建并立即调用一个函数...
用矩阵求对称闭包。简洁,轻松学习,相互交流。
JS闭包可被利用的常见场景。值得保留的文档。值得一看
Swift之闭包ClosureDemo