`
zccst
  • 浏览: 3322080 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

js-闭包(妙版)

 
阅读更多
zccst整理

总结:
1,闭包是什么
闭包

2,闭包好处:
(1)希望一个变量长期驻扎在内存中。
(2)避免全局变量的污染。
(3)私有成员的存在

3,怎么用
模块化代码
例子
在循环中直接找到对应元素的索引
例子

4,可能存在的问题
内存泄露。外部变量与内部变量互相引用。导致内存越来越大。

解决办法:
1,及时释放dom结点对象。




闭包
定义:函数嵌套函数,内部函数可以引用外部函数的参数和变量,参数和变量不会被垃圾回收机制收回。
function aaa(){
  var a = 5;
  function bbb(){
    alert(a);
  }
  return bbb;
}
var c = aaa();
c();//5
c();//5

结论:变量一直存在。由于其参数和变量由于被内部函数使用,所以不会被收回。


垃圾回收机制
function aaa(){
  var a = 12;
  a++;
  alert(a);
}
aaa();//13  即函数执行完之后,局部变量被回收。
aaa();//13  再次调用时,重新赋值。

alert(a);//a未定义,即离开作用域后,局部变量已被回收(外部不能访问)。


var a = 12;
function aaa(){
  a++;
  alert(a);
}
aaa();
aaa();
//问题是:污染了全局变量。如果连续调用aaa();则变量a的值会递增。




而我们既想使用局部变量,又想像全局变量一样累加(即闭包),则可如下所示:
//第一版:
function aaa(){
  var a = 1;
  return function(){
    a++;
    alert(a);
  }
}
var b = aaa();
b();//2
b();//3

//第二版:把函数声明改写为函数表达式
var aaa = (function(){
  var a = 1;
  return function(){
    a++;
    alert(a);
  }
})();

aaa();
aaa();



更进一步,把函数变私有,,即模块化代码。
var aaa = (function(){
  var a = 1;
  function bbb(){
    a++;
    alert(a);
  }
  function ccc(){
    a++;
    alert(a);
  }
  return { //json格式
    b:bbb,
    c:ccc
  }
})();

aaa.b();//2
aaa.c();//3  a对于两个函数,相当于全局。


alert(a);  //异常,未定义
alert(bbb);//异常,未定义
alert(ccc);//异常,未定义



在循环中直接找到对应元素的索引
window.onload = function(){
	var aLi = document.getElementsByTagName("li");
	
	//方式一:有问题
	for (var i = 0; i < aLi.length; i++){
		aLi[i].onclick = function(){
			alert(i);
		};
		//问题:for循环后,i已经是4,所以所有li的click都是4。
	}
	
	//方式二:
	for (var i = 0; i < aLi.length; i++){
		(function(i){
			//内部函数可以使用外包函数的参数和变量。
			//外包函数执行完毕后,内部函数依然存在。
			aLi[i].onclick = function(){alert(i);}
		})(i);
	}
	
	//方式三:
	for (var i = 0; i < aLi.length; i++){
		aLi[i].onclick = (function(i){
			//内部函数可以使用外包函数的参数和变量。
			//外包函数执行完毕后,内部函数依然存在。
			return function(){
				alert(i);
			}
		})(i);
	}
	
};
<ul>
<li>1111111111111</li>
<li>1111111111111</li>
<li>1111111111111</li>
<li>1111111111111</li>
</ul>




IE下引发内存泄露
window.onload = function(){
  var oDiv = document.getElementById("div1");
  oDiv.onclick = function(){
    alert(oDiv.id);
  }

  //方法一:
  window.unonload = function(){
    oDiv.onclick = null;
  }
}

 //方法二:
window.onload = function(){
  var oDiv = document.getElementById("div1");
  var id = oDiv.id;//然后在内部函数中使用id,而不是oDiv即可解决
  oDiv.onclick = function(){
    alert(oDiv.id);
  }
  oDiv = null;
}




分享到:
评论

相关推荐

    17-闭包和装饰器(python和linux高级编程阶段 代码和截图)

    17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级编程阶段 代码和截图)17-闭包和装饰器(python和linux高级...

    javascript-闭包详解.doc

    javascript-闭包详解.doc

    前端面试相关-闭包的使用场景

    前端面试相关--闭包的使用场景

    04-闭包函数.html

    04-闭包函数

    12.函数进阶-闭包装饰器.md

    12.函数进阶-闭包装饰器.md

    ios-闭包传值.zip

    在iOS开发中,闭包(Closure)是一种强大的编程工具,它允许我们定义代码块并可以在程序的不同地方作为值传递。闭包可以捕获和存储它所在上下文中的常量和变量,这使得它们非常适合用于异步操作、回调函数或者封装一...

    swift菜鸟入门视频教程-07-闭包

    在这个“Swift菜鸟入门视频教程-07-闭包”中,我们将深入探讨Swift中的一个重要概念——闭包。闭包在编程中是一种功能强大且灵活的工具,它允许我们定义可存储和传递的匿名函数。 闭包在Swift中的基本概念: 1. **...

    离散数学-闭包运算-.net

    闭包运算则是离散数学中的一个核心概念,它广泛应用于图论、逻辑学和计算机程序设计中。在本实验中,我们将探讨如何在.NET环境中,利用C#语言实现闭包运算,特别是通过Warshall算法。 闭包运算定义了一种在集合上...

    L-闭包空间的rs-连通性 (2010年)

    ### L-闭包空间的rs-连通性 #### 概述 本文主要探讨了L-闭包空间中rs-连通性的概念及其性质。在拓扑学领域中,连通性是一个重要的研究主题,它涉及到空间的整体结构特性。本文作者在前人工作的基础上,进一步扩展...

    groovy(10)-闭包委托策略1

    在Groovy语言中,闭包是一种强大的特性,它允许我们创建可执行的代码块,并可以在不同的上下文中使用。闭包有三个重要的变量:`this`, `owner`, 和 `delegate`,它们各自扮演着不同的角色。 1. **this**: `this`...

    论文研究-闭包算子空间范畴及其性质研究.pdf

    基于对闭包运算的性质研究,引入了闭包算子空间及其之间的连续映射概念,证明了闭包算子空间(对象)及其之间的连续映射(态射)构成范畴(闭包算子范畴)。证明了闭包算子空间范畴中(有限)积和(有限)余积的存在...

    计算NFA中ε闭包

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

    Golang mk教程-Go语言视频零基础入门到精通项目实战web编程

    第04天-基础-闭包、数组、切片、锁机制 第05天-进阶-排序、链表、二叉树、接口 第06天-进阶-接口与反射详解 第07天-进阶-接口实例、终端文件读写、异常处理 第08天-进阶-goroute详解、定时器与单元测试 第09天-高级-...

    论文研究-闭包算子与邻域系的广义化.pdf

    在一般拓扑学中,拓扑结构可以通过一系列基本概念来刻画,如邻域、内部、闭包以及滤子(网)的收敛等。这些概念的经典定义依赖于特定的公理系统,例如闭包算子的定义通常依赖于下面的公理:(C1)对于任意子集A和B,...

    js代码-闭包隐藏变量

    让我们深入探讨一下闭包的原理、用途以及如何在`main.js`这样的JavaScript文件中实现它们。 闭包的原理主要基于JavaScript的作用域链。当一个函数被定义时,它会捕获其词法作用域内的所有变量,即使函数在其他地方...

    swift-闭包、通知、协议、单例简单使用、界面传值

    博客地址 http://blog.csdn.net/qq_26598821/article/details/51254224 GitHub地址 ...swift语言的闭包(block)通知,协议,单例的简单使用。该demo较清晰得介绍四种方式的书写,简洁明了。

    关于S-集与S-闭包 (1987年)

    本文探讨了拓扑空间中的S-集与S-闭包的概念,并在此基础上研究了S-闭空间的相关性质,同时给出了一些推广和改进前人定理的结果。在正式开始之前,需要了解几个基础概念: 1. S-集:S-集是一种特殊的子集,对于拓扑...

    M-闭包空间的积、和与商 (2010年)

    证明了M-闭包空间以及它们之间的连续映射所构成的范畴M-CS是-个topological construct但不是笛卡儿闭的(其中M是任-非空指标集),在此基础上给出了乘积M-闭包空间、直和M-闭包空间以及商M-闭包空间的概念,最后指出...

    L-闭包空间及Urysohn引理 (2005年)

    目的 研究L-闭包空间中与拓扑空间类似的一些性质。方法 定义L-闭包空间及它们之间的连续映射、开映射、闭映射和同胚映射,并给出这些映射的等价刻画,继而定义正规L-闭包空间。结果 证明了关于L-闭包空间的Urysohn...

    M- L-闭包系统间的特殊映射及其范畴性质 (2012年)

    定义了M- L-闭包系统和M- L-闭包系统间的连续映射、开映射、闭映射,讨论了这些映射的性质.证明了范畴M- L-CS (即M- L-闭包系统及它们之间的连续映射构成的范畴)是topological construct .作为应用,给出了M- L-闭包...

Global site tag (gtag.js) - Google Analytics