快速业务通道

JS教程:理解JavaScript闭包

作者 佚名技术 来源 网页制作 浏览 发布时间 2012-03-06
dash;-
闭包可能的用途是无限的,可能理解其工作原理才是把握如何使用它的最好指南。

意外的闭包

在创建可访问的内部函数的函数体之外解析该内部函数就会构成闭包。这表明闭包很容易创建,但这样一来可能会导致一种结果,即没有认识到闭包是一种语言特性的 JavaScript 作者,会按照内部函数能完成多种任务的想法来使用内部函数。但他们对使用内部函数的结果并不明了,而且根本意识不到创建了闭包,或者那样做意味着什么。

正如下一节谈到 IE 中内存泄漏问题时所提及的,意外创建的闭包可能导致严重的负面效应,而且也会影响到代码的性能。问题不在于闭包本身,如果能够真正做到谨慎地使用它们,反而会有助于创建高效的代码。换句话说,使用内部函数会影响到效率。

使用内部函数最常见的一种情况就是将其作为 DOM 元素的事件处理器。例如,下面的代码用于向一个链接元素添加 onclick 事件处理器:

/* 定义一个全局变量,通过下面的函数将它的值 作为查询字符串的一部分添加到链接的 – href – 中: */ var quantaty = 5; /* 当给这个函数传递一个链接(作为函数中的参数 – linkRef -)时, 会将一个 onclick 事件处理器指定给该链接,该事件处理器 将全局变量 – quantaty – 的值作为字符串添加到链接的 – href – 属性中,然后返回 true 使该链接在单击后定位到由 – href – 属性包含的查询字符串指定的资源: */ function addGlobalQueryOnClick(linkRef){ /* 如果可以将参数 – linkRef – 通过类型转换为 ture (说明它引用了一个对象): */ if(linkRef){ /* 对一个函数表达式求值,并将对该函数对象的引用 指定给这个链接元素的 onclick 事件处理器: */ linkRef.onclick = function(){ /* 这个内部函数表达式将查询字符串 添加到附加事件处理器的元素的 – href – 属性中: */ this.href += (’?quantaty=’+escape(quantaty)); return true; }; } }

无论什么时候调用 addGlobalQueryOnClick 函数,都会创建一个新的内部函数(通过赋值构成了闭包)。从效率的角度上看,如果只是调用一两次 addGlobalQueryOnClick 函数并没有什么大的妨碍,但如果频繁使用该函数,就会导致创建许多截然不同的函数对象(每对内部函数表达式求一次值,就会产生一个新的函数对象)。

上面例子中的代码没有关注内部函数在创建它的函数外部可以访问(或者说构成了闭包)这一事实。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号