`
xiaomiya
  • 浏览: 131855 次
  • 性别: 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;
};

 

 

 

分享到:
评论

相关推荐

    自己理解的关于闭包函数

    自己理解闭包函数

    闭包实现ztree增删改查

    在IT行业中,尤其是在前端开发领域,ZTree是一款广泛使用的JavaScript组件,它主要用于构建树状结构...希望这个关于闭包实现ZTree增删改查的解释对你有所帮助,如果你在实际应用中有任何问题,都可以进一步研究和探索。

    闭包的理解

    通过以上分析,我们可以得出以下几点关于闭包的重要结论: 1. **保持状态**:闭包使得函数能够访问并操作其外部作用域中的变量,即使外部函数已经执行完毕。 2. **封装性**:闭包可以保护私有数据,因为外部作用域...

    闭包.playground.zip

    在`playground.zip`中的`闭包.playground`文件中,你可以找到更多关于闭包的实际示例和练习,进一步加深对闭包的理解。通过实践这些示例,你会更加熟练地掌握Swift中的闭包用法,并能在实际项目中灵活运用。

    closure闭包1

    以下是关于闭包的详细解释: 1. **闭包定义** - 闭包的语法通常是大括号 `{}` 内包含一系列语句。如果闭包有参数,那么参数会放在大括号前,并通过 `-&gt;` 分隔参数列表和代码块。例如: ```groovy { param -&gt; ...

    Swift视频教程 基础语法系列 闭包参数类型推断

    本教程重点聚焦于Swift的基础语法,特别是关于闭包的参数类型推断这一重要概念。 闭包是Swift中的一个重要特性,它们可以捕获和存储其所在上下文中的常量和变量,这使得闭包可以访问和修改这些值,即使闭包本身已经...

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

    在计算机科学中,闭包是一种重要的概念,尤其在函数式编程和逻辑编程中。闭包在C语言中可能不如在一些动态类型的语言中那么常见,但依然可以通过巧妙的技巧实现。这里我们将详细讨论如何用C语言实现传递闭包、自反...

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

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

    关系闭包的计算

    ### 关系闭包的计算 #### 实验背景与目的 在计算机科学与数学领域中,关系闭包是一种重要的概念,特别是在图论与数据库理论中有着广泛的应用。本实验旨在通过编程实践的方式帮助学习者深入理解关系闭包的概念,并...

    计算NFA中ε闭包

    ### 计算NFA中的ε闭包 #### 一、NFA与ε闭包概念介绍 **非确定有限自动机(NFA)**是一种理论计算模型,它扩展了确定有限自动机(DFA)的概念,允许在某些情况下从一个状态出发到达多个状态。在NFA中,存在一种特殊的...

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

    对于许多开发者来说,虽然接触过不少关于闭包的文章,但真正能够深入理解并灵活运用闭包的并不多。这主要是因为闭包涉及到一系列相互关联的知识点,只有把这些知识点串联起来,才能构建起一个完整且清晰的理解框架。...

    javascript 闭包实例

    在压缩包的`task_list.txt`和`js_learn.txt`文件中,可能会包含更多关于闭包的练习和学习资料。通过深入学习和实践这些内容,你将能够更好地理解和掌握JavaScript闭包的精髓,并将其应用于实际项目中,提高代码的...

    Java闭包 Java闭包

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

    求闭包 属性集闭包 函数依赖的闭包

    3. 用户输入完毕所有的依赖后,显示“请输入属性集求闭包”的提示,当用户输入1个或者多个属性时,求出对应的闭包。(如,用户输入A,则显示A+的值, 用户输入AB则求出AB+的值。显示完毕后,再次显示“请输入属性集...

    对于三元闭包的验证.zip

    在IT领域,三元闭包是一个重要的概念,特别是在社交网络分析和图论中。这个理论主要探讨了在社交网络中的关系连接模式,特别是在理解和描述个体之间的互动和连通性时起到关键作用。在这个场景中,"对于三元闭包的...

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

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

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

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

    用矩阵求自反闭包自反闭包

    在计算机科学和图论中,自反闭包是与关系理论相关的概念,特别是在布尔代数和图的子结构分析中。自反闭包是指给定一个关系R,将其扩展为包含所有起点到自身的元素对,即对于每一个元素a,都有(a, a)属于自反闭包。这...

    Swift之闭包ClosureDemo

    Swift中的闭包是一种强大的编程概念,它允许我们定义一段可移动和可重用的代码块,可以在函数中作为参数传递,也可以作为返回值。闭包在很多编程语言中都有类似的概念,但在Swift中,它们的设计既简洁又灵活,使得...

Global site tag (gtag.js) - Google Analytics