javascript中闭包之浅析解读(必看篇)

javascript中闭包之浅析解读(必看篇)

ID:27596034

大小:51.00 KB

页数:7页

时间:2018-12-05

javascript中闭包之浅析解读(必看篇)_第1页
javascript中闭包之浅析解读(必看篇)_第2页
javascript中闭包之浅析解读(必看篇)_第3页
javascript中闭包之浅析解读(必看篇)_第4页
javascript中闭包之浅析解读(必看篇)_第5页
资源描述:

《javascript中闭包之浅析解读(必看篇)》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、JavaScript中闭包之浅析解读(必看篇)JavaScript中的闭包真心是一个老生常谈的问题了,最近面试也是一直问到,我自己的表述能力又不能完全支撑起来,真是抓狂。在回来的路上,我突然想到了一个很简单的事情,其实我们在做项目时候,其实就经常用到闭包的,可是面试问的时候,回答又往往是我们经常搜到的答案,唉不管是应付面试还是真的想学点东西,我也用自己的理解跟大家分享一下,书面化就避免不了了的。1.闭包是什么?红宝书中曰:“是指有权访问另外一个函数作用域中的变量的函数。”简单的说,JavaScript允许使用内部函数即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以

2、访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。再通俗的说就是“一个函数内部创建另外一个函后面这个函数可以读取上面那个函数中的变量,后面这个函数就可以称作‘闭包’”。2.闭包有啥用?通过我大量的查阅,如果说“通过使用闭包,我们可以做很多事情。比如模拟面向对象的代码风格;更优雅,更简洁的表达出代码;在某些方面提升代码的执行效率”,会不会感觉很空洞,那这些会不会好一些,由于在JavaScript中没有真正的块级作用域,但是为了给某个函数声明一些只有该函数才能使用的局部变量时,我们就会用到闭包,这样

3、我们可以很大程度上减少全局作用域中的变量净化全局作用域。下面举例说明一下:1.匿名自执行函数我们知道所有的变量,如果不加上var关键字,则默认的会添加到全局对象的属性上去,这样的临时变量加入全局对象有很多坏处,比如:别的函数可能误用这些变量;造成全局对象过于庞大,影响访问速度(因为变量的取值是需要从原型链上遍历的)。了每次使用变量都是用var关键字外,我们在实际情况下经常遇到这样一种情况,即有的函数只需要执行一次其内部变量无需维护,比如UI的初始化,那么我们可以使用闭包:vardata={nbsp;nbsp;table:[],nbsp;nbsp;tree:{}nbsp;}:nbsp;(

4、function(dm){nbsp;nbsp;for(vari=0:ilt;dm.table.rows:i++){nbsp;nbsp;nbsp;varrow=dm.table.rows[i];nbsp;nbsp:nbsp;for(varj=0;jit;row.cells;i++){nbsp:nbsp;nbsp;nbsp;drawCell(i,j):nbsp;nbsp;nbsp;}nbsp:nbsp;}nbsp;})(data);我们创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在函数执行完后会立刻释放资源,关键是不污染全局对象。2.结果缓存我们开发中会碰到很多情

5、况,设想我们有一个处理过程很耗时的函数对象,每次调用都会花费很长时间,那么我们就需要将计算出来的值存储起来,当调用这个函数的时候,首先在缓存中查找,如果找不到,则进行计算,然后更新缓存并返回值,如果找到了,直接返回查找到的值即可。闭包正是可以做到这一点,因为它不会释放外部的引用,从而函数内部的值可以得以保留。varCachedSearchBox=(function(){nbsp;nbsp;varcache={},nbsp;nbsp;nbsp;count=口;nbsp;nbsp;return{nbsp;nbsp;nbsp;attachSearchBox:function(dsid){nb

6、sp;nbsp;nbsp;nbsp;if(dsidincache){//如果结果在缓存中nbsp;nbsp;nbsp;nbsp;nbsp;returncache[dsid]://直接返回缓存中的对象nbsp;nbsp:nbsp;nbsp;}nbsp;nbsp;nbsp;nbsp;varfsb=newuikit.webctrl.SearchBox(dsid)://新建nbsp;nbsp;nbsp;nbsp:cache[dsid]=fsb;//更亲斤缓存nbsp;nbsp;nbsp;nbsp:if(count.1engthgt:100){//保正缓存的大小lt;=100nbsp;nbsp;

7、nbsp;nbsp;nbsp:deletecache[count,shift()]:nbsp;nbsp;nbsp:nbsp;}nbsp;nbsp;nbsp:nbsp:returnfsb;nbsp;nbsp;nbsp;nbsp;nbsp;},nbsp;nbsp:nbsp;clearSearchBox:function(dsid){nbsp;nbsp;nbsp:nbsp;if(dsidincache){nbsp;nbsp;nbsp;nbsp;nbs

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。