什么是闭包

对于初次步入代码界的小朋友们,听说闭包这个词,感觉摸不着头脑,所以本人亲自整理了一下理解闭包的思路,本文主要是从三个反面阐述了闭包:1,什么是闭包;2闭包的好处以及应用;3,使用闭包需要注意什么。别的不多说了,直接上码。

一,什么是闭包?

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

例1:这是一个比较明显的闭包

function show(a){ //外面的函数 a是参数(实质也是函数show的局部变量)

var b=12;//b是局部变量

function show1(){//里面的函数

console.log(a); //=》2 //里面的函数可以访问到外面函数的参数和变量

console.log(b); //=》12

}

show1();

}

show(2);

例2:解释一下垃圾回收机制

function aaa(){

var a=12;//a是局部变量

alert(a);

a++;

}

aaa();//=》 12

aaa();//=》 12

//执行2次aaa函数,弹出的结果都是12,说明变量a每执行一次,都会被垃圾回收机制所回收,重新调用的时候就会重新执行初始的代码,如果写成闭包的形式再来看一下:

function aaa(){

var a=12;

return function(){

alert(a);

a++;

}

}

var b=aaa();

b();//=》 12

b();//=》 13

//定义函数aaa的时候,形成了函数嵌套函数的闭包,其中的变量a在第一次执行b的时候不会被垃圾回收机制所回收,所以第一次出来结果是12,然后在此基础是a++,再次执行时就变成了13。这个例子也说明的闭包的第一个好处,希望一个变量长期驻扎在内存之中

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

1,希望一个变量长期驻扎在内存之中(见例2)

2,避免全局变量的污染

例3:我们先来写个全局变量,然后定义一个函数试一试

var a=12;

function show(){

alert(a);

a++;

}

show();//=》 12

show();//=》 13

alert(a);//全局变量最后变成了=》 14,显然全局变量被污染了。

我们在写成闭包的形式来看一下:

var a=12;

var b=(function(i){

return function(){

alert(i);

i++;

}

})(a)

b();//=》 12

b();//=》 13

alert(a);//全局变量依然是=》 12,没有被污染

3,私有成员的存在

例4:

function show(){

var a=12;

function show1(){

alert(a);

a++;

}

function show2(){

alert(a);

a++;

}

return {show1:show1,show2:show2};

}

var b=show();//调用函数的返回值

b.show1();//=》 12

b.show2();//=》 13 两次执行都是调用变量他们公共的变量a

alert(a)//报错

alert(show1)//报错

alert(show2)//报错

//在这里需要知道函数本质其实是一个特殊的对象,函数里面的变量a,定义的函数show1和show2,都属于函数的私有成员,在外面访问不到会报错。

应用:例2中的(function(){})()形式,就是闭包的一个典型的影响,我们可以称作是封闭空间,也可说是模块化代码

三,使用闭包需要注意什么

使用有可能出现内存泄漏,在这里只是简单说一下原理

例5:

window.onload=function(){

var oBtn=document.getElementById('btn');

oBtn.onclick=function(){

alert(oBtn.id)//btn

}

}

//此种形式也形成了函数嵌套函数的闭包形式,点击按钮oBtn的时候,变量oBtn的点击事件得不到释放,影响cpu的性能,导致内存泄漏,这个时候可以点击之后,加oBtn.onclick=null;是变量oBtn的点击时候得到释放

注,闭包贯穿整个js,如果想彻底理解闭包很难,所以想深入理解闭包需要在工作中长期的沉淀积累,如果各位大神有更好的理解方式可以留言,我们共同探讨

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,636评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,890评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,680评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,766评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,665评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,045评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,515评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,182评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,334评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,274评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,319评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,002评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,599评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,675评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,917评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,309评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,885评论 2 341

推荐阅读更多精彩内容

  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,031评论 0 7
  • 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 一、变量...
    zock阅读 1,072评论 2 6
  • 第一章: JS简介 从当初简单的语言,变成了现在能够处理复杂计算和交互,拥有闭包、匿名函数, 甚至元编程等...
    LaBaby_阅读 1,628评论 0 6
  • 凌晨三点, 雨好大, 打湿了我抱在坏里的泡面, 最近好像一直都很忙, 并没有留下只言片语, 坚持。
    有童年没青春阅读 189评论 0 0
  • 静静地看着这些布偶,在这个快速繁杂的世界有时候简单是多么的奢侈。
    万圣节的魔棒阅读 179评论 0 0