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 相关文章推荐
JavaScript生成GUID的多种算法小结
Aug 18 Javascript
简单的Jquery遮罩层代码实例
Nov 14 Javascript
js螺旋动画效果的具体实例
Nov 15 Javascript
javascript正则表达式参数/g与/i及/gi的使用指南
Aug 27 Javascript
jQuery中:text选择器用法实例
Jan 03 Javascript
jQuery实现个性翻牌效果导航菜单的方法
Mar 09 Javascript
深入研究jQuery图片懒加载 lazyload.js使用方法
Aug 16 jQuery
详解AngularJS跨页面传值(ui-router)
Aug 23 Javascript
JSON在Javascript中的使用(eval和JSON.parse的区别)详细解析
Sep 05 Javascript
Angular 4根据组件名称动态创建出组件的方法教程
Nov 01 Javascript
Vue 通过自定义指令回顾v-内置指令(小结)
Sep 03 Javascript
如何在JS文件中获取Vue组件
Sep 16 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
jQuery html()等方法介绍
2009/11/18 Javascript
Javascript学习笔记4 Eval函数
2010/01/11 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
Jquery通过JSON字符串创建JSON对象
2014/08/24 Javascript
Javascript基础教程之JavaScript语法
2015/01/18 Javascript
浅谈JavaScript中指针和地址
2015/07/26 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
2015/12/09 Javascript
高效利用Angular中内置服务$http、$location等
2016/03/22 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
swiper4实现移动端导航切换
2020/10/16 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
Python在线运行代码助手
2016/07/15 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
解决Python字典写入文件出行首行有空格的问题
2017/09/27 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Python中的asyncio代码详解
2019/06/10 Python
Python识别处理照片中的条形码
2020/11/16 Python
使用Python判断一个文件是否被占用的方法教程
2020/12/16 Python
详解Python Celery和RabbitMQ实战教程
2021/01/20 Python
CSS3制作酷炫的三维相册效果
2016/07/01 HTML / CSS
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
法国美发器材和产品购物网站:Beauty Coiffure
2016/12/05 全球购物
中间件分为哪几类
2016/09/18 面试题
简历中求职的个人自我评价
2013/12/03 职场文书
消防安全员岗位职责
2014/03/10 职场文书
洗车工岗位职责
2014/03/15 职场文书
《小动物过冬》教学反思
2014/04/17 职场文书
2015欢度元旦标语口号
2014/12/09 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
中国汉字听写大会观后感
2015/06/02 职场文书
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL