JavaScript中闭包之浅析解读.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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;

文档评论(0)

ggkkppp + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档