频道栏目
读书频道 > web开发 > Javascript > JavaScript编程精解(原书第2版)
3.8 闭包
2015-12-04 14:56:50     我来说两句
收藏   我要投稿
《高级程序设计(第3版)》是 超级畅销书的**新版。ECMAScript 5 和HTML5 在标准之争中双双胜出,使大量专有实现和客户端扩展正式进入规范,同时也为 增添了很多适应未来发展的新特性。本书这一版除增加5 章  立即去当当网订购

函数可以作为值使用,而且其局部变量会在每次函数调用时重新创建,由此引出一个值得我们探讨的问题:如果函数已经执行结束,那么这些由函数创建的局部变量会如何处理呢?

下面的示例代码展示了这种情况。代码中定义了函数wrapValue,该函数创建了一个局部变量localVariable,并返回一个函数,用于访问并返回局部变量localVariable。




与你期望的一样,这段代码可以正确执行。其中的变量仍然可以访问。其实同一变量的多个实例可以同时存在,这也就很好地印证了局部变量会在每次函数调用时重新创建,不同的函数调用是不会对其他函数内的局部变量产生任何影响的。

我们把这种引用特定的局部变量实例的功能称为闭包。一个包装了一些局部变量的函数是一个闭包。利用闭包的特性,我们不再需要担心变量的生命周期问题,很多高级应用都依靠它来实现。

我们对上面那个例子稍加修改,就可以创建一个可以乘以任意数字的函数。


 

由于参数自身就是局部变量,因此我们不需要声明localVaraible变量。

需要花些时间进行练习才可以编写出类似于这样的程序。我们可以把关键字function当作一种“冻结”代码并将其打包成函数值的模型。所以当你看到“return function(…){…}”这样的代码时,你可以将其理解为一个句柄,其中句柄指向一段包装好的计算代码。

在本例中,multiplier返回了一段打包好的代码片段,并将其存储在twice变量中。最后一行调用了存储在该变量中的值,也就是调用multiplier创建的代码片段,随后将代码片段解包,并将5作为参数number传递给这段代码。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.7 可选参数
下一篇:3.9 递归
相关文章
图文推荐
排行
热门
最新书评
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站