快速业务通道

JS教程:理解JavaScript闭包

作者 佚名技术 来源 网页制作 浏览 发布时间 2012-03-06
实际上,同样的效果可以通过另一种方式来完成。即单独地定义一个用于事件处理器的函数,然后将该函数的引用指定给元素的事件处理属性。这样,只需创建一个函数对象,而所有使用相同事件处理器的元素都可以共享对这个函数的引用:

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

在上面例子的第一个版本中,内部函数并没有作为闭包发挥应有的作用。在那种情况下,反而是不使用闭包更有效率,因为不用重复创建许多本质上相同的函数对象。

类似地考量同样适用于对象的构造函数。与下面代码中的构造函数框架类似的代码并不罕见:

function ExampleConst(param){ /* 通过对函数表达式求值创建对象的方法, 并将求值所得的函数对象的引用赋给要创建对象的属性: */ this.method1 = function(){ … // 方法体。 }; this.method2 = function(){ … // 方法体。 }; this.method3 = function(){ … // 方法体。 }; /* 把构造函数的参数赋给对象的一个属性:*/ this.publicProp = param; }

每当通过 new ExampleConst(n) 使用这个构造函数创建一个对象时,都会创建一组新的、作为对象方法的函数对象。因此,创建的对象实例越多,相应的函数对象也就越多。

Douglas Crockford 提出的模仿 JavaScript 对象私有成员的技术,就利用了将对内部

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号