- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JavaScript中闭包之浅析解读(必看篇)
JavaScript中的闭包真心是一个老生常谈的问题了, 最近面试也是一直问到,我自己的表述能力又不能完全支 撑起来,真是抓狂。在回来的路上,我突然想到了一个很 简单的事情,其实我们在做项目时候,其实就经常用到闭 包的,可是面试问的时候,回答又往往是我们经常搜到的 答案,唉不管是应付面试还是真的想学点东西,我也用自 己的理解跟大家分享一下,书面化就避免不了了的。
1.闭包是什么?
红宝书中曰:“是指有权访问另外一个函数作用域中 的变量的函数。”
简单的说,J avaScript允许使用内部函数 即函数
定义和函数表达式位于另一个函数的函数体内。而且,这 些内部函数可以访问它们所在的外部函数中声明的所有局 部变量、参数和声明的其他内部函数。当其中一个这样的 内部函数在包含它们的外部函数之外被调用时,就会形成
闭包。再通俗的说就是“一个函数内部创建另外一个函
后面这个函数可以读取上面那个函数中的变量,后面这个 函数就可以称作‘闭包’”。
2.闭包有啥用?
通过我大量的查阅,如果说“通过使用闭包,我们可
以做很多事情。比如模拟面向对象的代码风格;更优雅,
更简洁的表达出代码;在某些方面提升代码的执行效率”, 会不会感觉很空洞,那这些会不会好一些,由于在Java Script中没有真正的块级作用域,但是为了给某个函数声
明一些只有该函数才能使用的局部变量时,我们就会用到 闭包,这样我们可以很大程度上减少全局作用域中的变量 净化全局作用域。
下面举例说明一下:
1.匿名自执行函数
我们知道所有的变量,如果不加上var关键字,则默 认的会添加到全局对象的属性上去,这样的临时变量加入 全局对象有很多坏处,
比如:别的函数可能误用这些变量;造成全局对象过 于庞大,影响访问速度(因为变量的取值是需要从原型链上 遍历的)。
了每次使用变量都是用var关键字外,我们在实际情 况下经常遇到这样一种情况,即有的函数只需要执行一次 其内部变量无需维护,
比如UI的初始化,那么我们可以使用闭包:
vard ata= {nbsp;
n bsp;table:[], nbsp;
nbsp ; tree: {}nbs p;
}:nbsp;
(f unction(dm){nbsp;
nbs p; for (vari=0: ilt;dm. ta ble. rows: i++) {nbsp; n bsp;nbsp; va rrow=dm. tab le. rows[i] ;nbsp; nbsp : nbsp;for (v arj=0; jit ;r ow. cells; i++) {nbsp: n bsp;nbsp;nb sp;drawCell (i, j) :nbsp;
nbsp;nbsp;}nbsp:
nbsp;}nbsp;
}) (dat a);
我们创建了一个匿名的函数,并立即执行它,由于外 部无法引用它内部的变量,因此在函数执行完后会立刻释 放资源,关键是不污染全局对象。
2.结果缓存
我们开发中会碰到很多情况,设想我们有一个处理过 程很耗时的函数对象,每次调用都会花费很长时间,那么 我们就需要将计算出来的值存储起来,当调用这个函数的 时候,首先在缓存中查找,如果找不到,则进行计算,然 后更新缓存并返回值,如果找到了,直接返回查找到的值 即可。闭包正是可以做到这一点,因为它不会释放外部的 引用,从而函数内部的值可以得以保留。
varCached SearchBox= (function() {nbsp; nbsp ;varcache={},nbsp; nb sp;nbsp;cou nt= 口;nbsp;
nbsp;return {nbsp;
nbs p;nbsp;atta chSearchBox :function(d sid){nbsp; nbsp;nbsp;nbsp; if (dsi dincache) {//如果结果在缓存
中 nb sp;
nbsp;n bsp;nbsp;nb sp;returnca che[dsid] ://直接返 回缓存中的对象nbsp;
nbsp :nbsp;nbsp;}nbsp;
nbs p;nbsp;nbsp ;varfsb=new uikit. webct rl. SearchBo x(dsid) ://新建 nbsp;
nbs p;nbsp;nbsp :cache[dsid ]=fsb;//更亲斤缓存 nbsp; nbs p; nbsp; nbsp : if (count. 1 engthgt: 100 ) {//保正
缓存的大小lt;=100nbsp ;
nbsp;nbs p;nbsp;nbsp :deletecach e[count, shi ft ()] :nbsp;
您可能关注的文档
最近下载
- 注册香港公司的香港投资环境介绍。.doc VIP
- 9《天上有颗南仁东星》课件 统编版语文八年级上册.pptx VIP
- 第8讲 二《德不可空谈》课件 学生读本高年级 (1).pptx
- 脚手架、满堂架钢管、扣件用量的计算.xls VIP
- 1-3-4氧化还原反应配平教学设计2023-2024学年高一上学期化学人教版(2019)必修第一册.docx VIP
- 石油化工金属管道布置设计规范.docx VIP
- 中国IBD蓝皮书 -中国炎症性肠病医患认知 暨生存质量报告 溃疡性结肠炎部分.docx
- AB变频器PowerFlex 700 说明书.pdf VIP
- 压覆影响区范围的确定、压覆矿产资源调查报告编写提纲、评估报告编写提纲.docx VIP
- 公安辅警综合基础知识题库汇总及答案解析.docx VIP
文档评论(0)