因为本人是做java web 开发的,对js仅仅是存在非常浅的理解,js闭包的概念非常早就听说了,可是一直都不明确是什么意思,今天准备梳理一下闭关的概念;

闭包(closure)是Javascript语言的一个难点,也是它的特色,非常多高级应用都要依靠闭包实现。

闭包的特性:

1.函数嵌套函数
2.函数内部能够引用外部的參数和变量
3.參数和变量不会被垃圾回收机制回收

闭包的定义及其优缺点

闭包 是指有权訪问还有一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建还有一个函数。通过还有一个函数訪问这个函数的局部变量

闭包的缺点就是常驻内存,会增大内存使用量,使用不当非常easy造成内存泄露。

闭包是javascript语言的一大特点。主要应用闭包场合主要是为了:设计私有的方法和变量。

一般函数运行完成后。局部活动对象就被销毁,内存中只保存全局作用域。但闭包的情况不同!

嵌套函数的闭包:

function sum(){
var a=1;
return function(){
alert(a++)
};
}
var fun=sum();
fun(); //运行后a++,然后a还在
fun();
fun=null; //a被回收

闭包会使变量始终保存在内存中,假设不当使用会增大内存消耗。

javascript的垃圾回收原理

(1)、在javascript中,假设一个对象不再被引用,那么这个对象就会被GC回收。 

(2)、假设两个对象互相引用,而不再被第3者所引用。那么这两个互相引用的对象也会被回收。

使用闭包的优点

那么使用闭包有什么优点呢?使用闭包的优点是:

全选复制放进笔记
<script>
var abc = (function(){ //abc为外部匿名函数的返回值
var a = 1;
return function(){
a++;
alert(a);
}
})();
abc(); //2 ;调用一次abc函数。事实上是调用里面内部函数的返回值
abc(); //3
</script>

五、私有成员的存在


var aaa=(function(){
var a=1;
function bbb(){
a++;
return a;
}
function ccc(){
a++;
return a;
}
return {
b:bbb, //为内部方法取一个别名 json结构
c:ccc
}
})();
alert(aaa.b()); //2
alert(aaa.c()); //3

六.使用匿名函数实现累加

我们先看看不使用匿名函数的情况下
function box(){
var age=100;
age++;
return age;
}
var b=box();
alert(b);

在看看使用匿名函数的情况

//使用匿名函数实现局部变量驻留内存中。从而实现累加

<script type="text/javascript">

 function box(){
var age = 100;
return function(){ //匿名函数
age++;
return age;
}; }
var b = box();
alert(b());

过度使用闭包会导致性能的下降。

函数里放匿名函数,则产生了闭包.在这样的情况下我们最好不要使用闭包;假设使用了闭包要记得释放引用;

b = null。  //解除引用,等待垃圾回收

七、在循环中直接找到相应元素的索引

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title></title>
<script>
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);
}
};
</script> </head>
<body>
<ul>
<li>123</li>
<li>456</li>
<li>789</li>
</ul>
</body>
</html>

以上内容转载自https://segmentfault.com/a/1190000000652891

闭包的深入理解:
闭包和匿名函数的两个概念。上面说过闭包是指有权訪问还有一个函数作用域中的变量的函数。创建闭包最简单的方式,就是在一个函数内部创建一个匿名函数。
闭包与变量:
作用域链的这样的配置机制引出了一个值得注意的副作用,即闭包仅仅能取得包括函数中不论什么变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的变量。
function createArray(){
var array=new Array();
for(var i=0;i<10;i++){
array[i]=function(){
return i;
};
}
return array;
}
createArray();

这个函数会返回一个函数数值。

表面上看,似乎每一个函数都应该返回自己的索引值,即位置0的函数返回0,位置1的返回1.单实际上每一个函数都返回10.由于每一个函数的作用域链中都保存着这个函数的活动对象。所以他们引用的都是同一个变量i。

当createArray创建后。变量i的值是10,此时每一个函数都引用着保存变量i的同一个变量对象,所以在每一个函数内部i的值都是10.我们能够通过匿名函数来让闭包的行为符合预期

		function createArray(){
var array=new Array();
for(var i=0;i<10;i++){
array[i]=function(num){
return function(){
return num
}
}(i);
}
return array;
}

在重写了前面的函数后,每一个函数就会返回各自不同的索引值了。在这个版本号中。我们没有直接把闭包赋值给数值,而是定义了一个匿名函数。并将马上运行该匿名函数的结果赋值给数组。

这里的匿名函数有一个參数num,也就是终于的函数要返回的值。在调用每一个匿名函数时。

我们传入了变量i.由于该函数时按值传递的。所以就会将i的当前值复制给參数num。

而在这个匿名函数内部,又创建并返回了一个訪问num的闭包。这样一来,result数组中的每一个函数都有自己num变量的一个副本。由于就能够返回各自不同的数值了;

最新文章

  1. struts2+hibernate整合-实现登录功能
  2. Sybase 常用SQL
  3. Nodejs 的 Express框架 学习体会 补充中。。。
  4. PKCS#1规范阅读笔记2--------公私钥ASN.1结构
  5. MongoDB的基本操作
  6. GIT常用命令备忘
  7. rbd命令
  8. c#如何区分静态只读变量和常量
  9. android log机制——输出log【转】
  10. Pike的安装(Ubuntu环境)
  11. Python全栈开发-web框架之django
  12. Java开发常用代码
  13. 解决Thinkpad E450 外接显示器后没有声音的问题
  14. dellR720重启找不到启动引导项,手动选择也无用。
  15. 一款好用的分页插件用于regularJS
  16. debian 安装jdk
  17. ZYNQ EMIO使用及可重用封装
  18. Java的反射技术
  19. 【Win】使用L2TP出现809错误
  20. mongoose中的流查询stream query

热门文章

  1. Tomcat容器的Session管理
  2. 常用GC算法
  3. MVP演化论
  4. 如何修改 WordPress 数据库前缀
  5. 利用JavaScript的%做隔行换色
  6. 机器学习PAI为你自动写歌词,妈妈再也不用担心我的freestyle了(提供数据、代码)
  7. Java代码运用及算法思路养成——用*号输出形状
  8. swift的属性与变量- Stored Properties and Instance Variables
  9. 转载:轻量级浏览器特性检测库:feature.js
  10. sass揭秘之@mixin,%,@function(转载)