Javascript匿名函数的一种应用 代码封装


Posted in Javascript onJune 27, 2010

在一些Javascript库中可以看见这种写法:

(function(){ 
//所有库代码代码 
})();

说实话,对于js初学者的我来说。这个东西太吓人了,在这些JS库中,这个函数基本上把整个库的所有代码全括起来了,这种写法完全超越了我的常识。难道不应该好好的划分一下吗,难道不应该体现出层次和功能划分吗,怎么会一个函数搞定呢。我一开始完全不敢去细想它的道理。直到使用JS一段时间后,某一天一位同事在闲聊时说起了这个问题,我才知道这个叫匿名函数。匿名函数我并不陌生,C#,Python,Lua中都有这个咚咚。我到网上去查了一下,介绍文章很多,也很详细,但是我心头的疑问却没有得到解决:为什么要这样写。
我找了一款著名的JS开源库JQuery,他的代码就是典型的以上写法,在粗略看了他的代码之后我发现这套代码实在太大了太复杂了,实在不适合我。于是我转而去看另外一个开源js库swfobject,这个库提供了简单的接口把Flash控件嵌入到网页中。这个代码好多了,很短,很快就看完了。看完之后我恍然大悟,原来如此。真理就是如此简单,之所以这样写,只有一个目的:封装。
初学JS的时候,我问过同事,js怎么定义私有函数和变量。当时的得到的答案是:js不是面向对象的,不提供这些功能。我对这个答案也坦然接受了,毕竟严格的封装并不是必要的。现在终于明白了,办法总是有的,在不支持封装的语言里同样可以实现封装。而实现的方法就是匿名函数。来看一段代码:
//定义 
function F(x) 
{ 
this.x = x; 
function double(x){return x*x;} 
this.getDoubleX(){ 
return double(this.x); 
} 
} //使用 
f = new F(12); 
alert(f.getDoubleX());

上面的代码很简单,我没有去运行它。懂点js的都知道这是JS的类定义方式。函数F相当于一个构造函数,而函数里面的其他定义都是函数私有的外部无法访问,例如double函数。这样就变相实现了私有方法。其他打上“this.”前缀的成员相当于公开成员,外部可以访问。
而这些库之所以要用一个大函数包裹整个库代码,就是为了不向使用者暴露内部方法和变量,强制用户只能访问开放的API。从这一点可以开出这些开发者的良苦用心。
到这里我不禁又要问了,js如何实现继承呢。希望这一次的答案不要像上一次一样:不支持。

Javascript 相关文章推荐
jquery 3D球状导航的文章分类
Jul 06 Javascript
js播放wav文件(源码)
Apr 22 Javascript
Javascript中this的用法详解
Sep 22 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
Jan 19 Javascript
js格式化输入框内金额、银行卡号
Feb 01 Javascript
jQuery针对input的class属性写了多个值情况下的选择方法
Jun 03 Javascript
JavaScript 冒泡排序和选择排序的实现代码
Sep 03 Javascript
微信小程序 判断手机号的实现代码
Apr 19 Javascript
Vue2 SSR渲染根据不同页面修改 meta
Nov 20 Javascript
脚手架vue-cli工程webpack的作用和特点
Sep 29 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
Jun 21 Javascript
在layui下对元素进行事件绑定的实例
Sep 06 Javascript
ymPrompt的doHandler方法来实现获取子窗口返回值的方法
Jun 25 #Javascript
让IE6支持min-width和max-width的方法
Jun 25 #Javascript
jQuery与其它库冲突的解决方法
Jun 25 #Javascript
jQuery.Validate 使用笔记(jQuery Validation范例 )
Jun 25 #Javascript
基于jquery的checkbox下拉框插件代码
Jun 25 #Javascript
jquery keypress,keyup,onpropertychange键盘事件
Jun 25 #Javascript
javascript中字符串替换函数replace()方法与c# 、vb 替换有一点不同
Jun 25 #Javascript
You might like
PHP写的获取各搜索蜘蛛爬行记录代码
2012/08/21 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
在Mac OS上自行编译安装Apache服务器和PHP解释器
2015/12/24 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
PHP调试及性能分析工具Xdebug详解
2017/02/09 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
JMenuTab简单使用说明
2008/03/13 Javascript
javascript new 需不需要继续使用
2009/07/02 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
JS 各种网页尺寸判断实例方法
2013/04/18 Javascript
jquery将一个表单序列化为一个对象的方法
2014/01/03 Javascript
JS中使用sort结合localeCompare实现中文排序实例
2014/07/23 Javascript
jQuery中$.get、$.post、$.getJSON和$.ajax的用法详解
2014/11/19 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
js实现日历的简单算法
2017/01/24 Javascript
JavaScript实现省市联动过程中bug的解决方法
2017/12/04 Javascript
前端axios下载excel文件(二进制)的处理方法
2018/07/31 Javascript
快速解决angularJS中用post方法时后台拿不到值的问题
2018/08/14 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 Javascript
[01:54]TI珍贵瞬间系列(五):压力
2020/08/29 DOTA
对TensorFlow中的variables_to_restore函数详解
2018/07/30 Python
使用Python处理BAM的方法
2018/09/28 Python
python-pyinstaller、打包后获取路径的实例
2019/06/10 Python
python版百度语音识别功能
2019/07/09 Python
Python dict的常用方法示例代码
2020/06/23 Python
浅谈盘点5种基于Python生成的个性化语音方法
2021/02/05 Python
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
大学生个人求职信范文
2013/09/21 职场文书
日语专业毕业生求职信
2013/12/04 职场文书
国际贸易专业个人职业生涯规划
2014/02/15 职场文书
新闻编辑求职信
2014/04/09 职场文书
食品质量与安全专业毕业生求职信
2014/08/11 职场文书
人代会简报
2015/07/21 职场文书
八年级作文之感悟亲情
2019/11/20 职场文书
本地通过nginx配置反向代理的全过程记录
2021/03/31 Servers