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基础知识大集锦(二) 推荐收藏
Jan 13 Javascript
JS实现可关闭的对联广告效果代码
Sep 14 Javascript
node.js微信公众平台开发教程
Mar 04 Javascript
BootStrap响应式导航条实例介绍
May 06 Javascript
Three.js学习之正交投影照相机
Aug 01 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
Sep 21 Javascript
js学习之----深入理解闭包
Nov 21 Javascript
JavaScript运动框架 链式运动到完美运动(五)
May 18 Javascript
JavaScript循环遍历你会用哪些之小结篇
Sep 28 Javascript
JavaScript隐式类型转换代码实例
May 29 Javascript
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
Mar 17 Javascript
JavaScript分页组件使用方法详解
Jul 26 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使用Nginx实现反向代理
2017/09/20 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
jquery中获取元素的几种方式小结
2011/07/05 Javascript
jQuery-serialize()输出序列化form表单值的方法
2012/12/26 Javascript
利用JavaScript实现新闻滚动效果(实例代码)
2013/11/27 Javascript
Javascript数组操作函数总结
2015/02/05 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
javascript中in运算符用法分析
2015/04/28 Javascript
基于Jquery和html5的7款个性化地图插件
2015/11/17 Javascript
获取阴历(农历)和当前日期的js代码
2016/02/15 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
jQuery实现图片轮播效果代码(基于jquery.pack.js插件)
2016/06/02 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
关于vuejs中v-if和v-show的区别及v-show不起作用问题
2018/03/26 Javascript
Node.js利用console输出日志文件的方法示例
2018/04/27 Javascript
vuex actions传递多参数的处理方法
2018/09/18 Javascript
js实现简单五子棋游戏
2020/05/28 Javascript
js实现简易点击切换显示或隐藏
2020/11/29 Javascript
Python自动登录126邮箱的方法
2015/07/10 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python智联招聘爬虫并导入到excel代码实例
2019/09/09 Python
python读写文件write和flush的实现方式
2020/02/21 Python
HTML5响应式(自适应)网页设计的实现
2017/11/17 HTML / CSS
戴尔荷兰官方网站:Dell荷兰
2020/10/04 全球购物
师范毕业生自荐信
2013/10/17 职场文书
班级德育工作实施方案
2014/02/21 职场文书
大学生活动总结模板
2014/07/02 职场文书
社区党员公开承诺书
2014/08/30 职场文书
超市开店计划书
2014/09/15 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
会计主管岗位职责
2015/04/02 职场文书
中学生社会实践教育活动总结
2015/05/06 职场文书
检举信的写法
2019/04/10 职场文书
Python使用Web框架Flask开发项目
2022/06/01 Python