头条  >   频道  >  正文

浅谈闭包与作用域

亲,暂时无法评论!

原标题:浅谈闭包与作用域

所谓闭包,官方一点儿的说法就是指有权访问另一个函数作用域的变量的函数。

那么什么又是作用域呢?

1.作用域

Java的作用域有两种,一种是全局作用域,另外一种是局部作用域,也称函数作用域。

全局作用域,顾名思义,全局作用域里面定义的变量和方法,在程序执行的过程中,可以被任何变量和函数调用和访问,而函数作用域里面定义的变量和函数,只能在该函数内部进行访问,下面给个例子:

let num = 1;

function add(param){ ++num; let sum = num + param;

returnsum;}add(2); //4

console.log(sum); //undefined

console.log(num); //2

上面代码中,sum变量是位于函数add内部的一个变量,当该函数执行完毕后,add函数内部定义的变量和方法都会被销毁,因此当函数add执行完成后,再次访问add函数内部的变量sum时,结果就会返回undefined。

那为什么函数内部可以访问到全局变量num呢?此时我们引入另一个概念,作用域链。

在每个作用域中,都会有一个与之相对应的变量对象,作用域链的作用是将该作用域下有权访问的变量对象有序的链接起来。

如图所示,全局作用域和函数add都会有自己的变量对象,函数add中的作用域链就是把函数add的变量对象和全局变量对象做链接,这样函数add就可以访问全局对象中的变量和方法,而且函数add的变量对象优先级高于全局变量对象。

let num = 1;

function add(param){ let num = 4; let sum = num + param; console.log(num); //4returnsum;}add(2); //6

函数在访问变量或方法过程中会根据作用域链里面全局变量对象的优先级去查找,先从函数本身的变量对象中查找是否有需要的变量或函数,如果没有再向上层寻找,若找到了就返回,否则则继续查找,直到访问到了全局变量对象。如上述代码,访问变量num时,全局变量对象和函数add变量对象中都有变量num,但是函数add变量对象优先高于全局,所以优先访问函数add变量对象中的变量num。

那如果我们想在函数add外部也能访问到变量sum,是不是就没有办法了呢?答案是否定的,这个时候就需要对闭包进行介绍了。

2.闭包

闭包,可以看做是函数内部与外部链接起来的一座桥梁,使得函数以外也可以访问到函数内部的变量。

闭包最常见方式就是在函数的内部创建另一个函数。

继续上面的例子,我们用闭包最常见方式对add函数进行改进,获取函数里面的sum,具体的改动如下:

let num = 1;

function add(param){ ++num; let sum = num + param;

returnfunction(sum){ console.log(sum); }}var sum = add(2);sum() //4

通过上面的方式,我们可以看到,当函数add被赋值给全局变量sum时,返回的是一个匿名函数,然后再执行函数sum,照理说,函数add在执行完成后,里面的变量和函数就会被销毁,所以当sum()函数再次被执行时,所打印的结果应该为undefined,但是在闭包中,虽然函数add执行后其中的变量和方法被销毁,但是此时的变量对象依然保存在内存之中,因此依然可以被访问,这里引入权威指南里面一句精辟的话 “Java中的函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行”

对于闭包,我们平时还会遇到一个常见的问题,即闭包只能取得包含函数中任意变量的最后一个值,如下:

function print(){ var arr= [];

for(var i=0; i<3; i++){ arr[i] = function() {

returni; } }

returnarr;}print()[0](); //3

print()[1](); //3

print()[2](); //3

在上面的写法中,我们的初衷是让函数执行后返回相应的索引值,比如执行print()[0]()返回0,执行print()[1]()返回1,但实际运行的结果是都返回3,我们来讲一下原因:上面所给出的函数在销毁的时候,函数当前的执行环节也会被销毁,但是它的活动对象依然被保留在内存中,因此在执行函数时,都引用了同一个变量对象中的i,所以导致得到了相同的结果。

综上所述,闭包的作用主要有两点:

1、可以让函数外部访问函数内部的变量。

2、让变量的值保存在内存中。

想要了解更多请关注我们

责任编辑:

君成录余莺儿剧情妻孝38章德云社小岳岳专场下载军囚悲歌,王义与白洁甜宠999次免费阅读青梅雨常迟落霞峰军阀攻x高冷戏子受风起天阑弹唱猎艳小说排行榜时光一去永不回往事只能回味绝色凤帝免费阅读小说落第是台湾谁写的欢欲后宫录77小说,吴冠中最重要的代表作郭大卫和维塔斯古风地图是什么意思平平淡淡诗句鹿包总裁文,邪气凛然杨薇篇1-727岁适合看什么书青春之殇讲了什么丽都后宫紫芋西米露的小说,扬州浮生记陈芷菁天地男兒暗卫攻略by螟蛉子,强烈推荐的恐怖小说2015秦腔名家清唱晚会,matteothun有哪些作品宋代的字体上官青云武侠,某潇洒从者的物语原山东省长李春亭死了黄色小说性爱描写网站公子小九的小说np大肉棒双性写给朋友的唯美句子天地无伦童话村观看古风手绘画花形容发芽的诗句王源推荐你曾是少年表达不变心的句子,非主流宫斗乐文爸爸干女儿txt迎龙朝天门近况楚楚动仁有小说吗皇帝成长计划2妃子晋升十年如故裴总你火了txt解密作者是谁,天灾人祸的感概句千叶公主塔尔情刑妃常攻略继妃生存手则毛泽东选集第二卷目录萝莉萌宠误闯吸血美男团宫锁红颜鄞州江山万里好么关羽过五关斩六将概括格列佛游记读后感200字总裁的夺爱游戏百里公子小说,幼儿故事嫦娥奔月视频盲君微盘黑夜的香蕉打包下载红楼林家夫人下载chanel2016春夏色爱可以重来txt下载女娲出装三从四德的现代说法你比时光更久远txt声律启蒙三江带拼音悲孽人生二十三章三庭下庭短小说认个局长做姐姐腹黑前妻皇后第二天遇害好看的农村题材小说瓜田李下,扑倒胖妻京剧坐宫李胜素,极品邪少岸江枫叶txt天神比武大会赤精大明1566海瑞的奏书非同小可小说,珍惜拥有议论文分论点越剧红楼梦连续剧移家别湖上亭阅读答案,经典言情邪斗耶西瓜影音,类似重生之媚宠妈妈网六字诗句大全插妹妹逼txt,手指舌尖探入甬道总裁责人之心责己恕己之心恕人夏娃的诱惑吻静林女强玄幻小说长篇完结千古相思梦锁清秋歌曲宦途迷情全文阅读iptd542封面林杰是哪个朝代的诗人修怜司内壁吞吐牧逸风慕千菡是什么小说重生女帝祸乱天下先锋影音另类小说用皮带绑手总裁马修伯恩睡美人母子情爱故事自编5言律诗哪里可以看缺宅男女全集新兰总裁文天才宝宝四大续命天王古代代表吉祥的字混世小村医结局我爱太深终成劫小说萧炎是几星斗帝名门宠媳全文阅读免费豪门总裁空枕红颜小说还珠格格之婚后孩子文韩熙载夜宴图作品赏析中岛京子出道作品,端木向宇的书创始元灵出自哪本小说良仙难求衍歧喜欢谁守一座空城等一个旧人是什么意思一本道2015作品斗春归全文免费阅读天使在人间萝依律类似正气寻妇录的小说杂志在线阅读迷情诗儿avi下载红楼梦王家的人物关系矢藤姬宫椎名东京热成人小说网穿越成大蛇丸的小说高干之作茧自缚宋城千古情门票儿童票国模小说一区我的穿越情缘高贵的d妇冯兰唐12绿母在线有声小说近在咫尺的爱恋好看吗sib005野村萌香既集坟典父女禁忌肉肉片段校园护花狂龙全文阅读全文汉字的故事400字不死七幻四平调《小包公》,昆山顾庆丰孟庆中龙族4下载完整小说盗妃天下全文阅读,汝阳刘居天简介邪月宫人龙族4风之哀翼幻灭观虎中王戎的形象斗破苍穹全文免费阅读.大黑吊战母女小说小说老公送上门邪王盛宠色色激情小说五月天轮回重生之灭欲弑神郑渊洁鬼车简介闯关上梁山黄盈霞超清成人性爱小说?性奴女刑警故事八马弹弓花满楼测试迅播宝莲灯后传凤凰花gl好看么评剧人逢喜事精神爽孽欲情毒(全本)猫千草作品集总裁太冷漠女生看的成人小说,最熟悉的陌生人小说男主帅女主美的av苍穹九界小说相思绝下绿帽家丁之元方来客小咖秀楚琰,三井悠乃隐退小马哥我就是神公交车上征服母亲小说犹记惊鸿照影书版结局曹轩宾-梦在前方韩国竹夫人古文注释惊弓之鸟《你的孤独虽败犹荣》读后感奴妻要翻身大结局水菜丽虐阴番号岁月里你别一直等高级娃娃任你摆布疯狂啃书网藏族风景图片大全春暖花开.姓吧有你sex8.cc主神大道龙空秦时明月金先生是谁凌晨心跳番外篇杜甫的诗及解释双笙姑娘故梦京剧的脸谱颜色农夫种田故事叶青的故事第10章井柏然倪妮同人现实文

我要报错
热门推荐

友情链接

注:凡本网注明来源非本站的作品,均转载自其它媒体,并不代表本网赞同其观点和对其真实性负责。

本站致力于资讯传播,希望建立合作关系。若有任何不当请联系我们,将会在24小时内删除。

tazaa.cn All Right Reserve 版权所有