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 导出数据到Excel(处理table中的元素)
Dec 18 Javascript
JavaScript 学习笔记(十二) dom
Jan 21 Javascript
鼠标右击事件代码(asp.net后台)
Jan 27 Javascript
js Object2String方便查看js对象内容
Nov 24 Javascript
JavaScript获取页面中表单(form)数量的方法
Apr 03 Javascript
js使用setTimeout实现定时炸弹的方法
Apr 10 Javascript
聊一聊JavaScript作用域和作用域链
May 03 Javascript
jQuery实现的跨容器无缝拖动效果代码
Jun 21 Javascript
JavaScript中点击事件的写法
Jun 28 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 Javascript
Node中使用ES6语法的基础教程
Jan 05 Javascript
vue项目打包后路由错误的解决方法
Apr 13 Vue.js
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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
php setcookie函数的参数说明及其用法
2014/04/20 PHP
php有道翻译api调用方法实例
2014/12/22 PHP
PHP  实现等比压缩图片尺寸和大小实例代码
2016/10/08 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
JavaScript 密码强度判断代码
2009/09/05 Javascript
根据选择不同的下拉值出现相对应的文本输入框
2013/08/01 Javascript
JavaScript编写连连看小游戏
2015/07/07 Javascript
js实现统计字符串中特定字符出现个数的方法
2016/08/02 Javascript
js实现上传文件添加和删除文件选择框
2016/10/24 Javascript
Javascript 两种刷新方法以及区别和适用范围
2017/01/17 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
jQuery实现简单弹幕效果
2019/11/28 jQuery
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
13个最常用的Python深度学习库介绍
2017/10/28 Python
Python使用三种方法实现PCA算法
2017/12/12 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
python实现本地图片转存并重命名的示例代码
2018/10/27 Python
python3.4爬虫demo
2019/01/22 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
2020/12/07 Python
html5开发三八女王节表白神器
2018/03/07 HTML / CSS
Ellos丹麦:时尚和服装在线
2016/09/19 全球购物
HTC VIVE美国官网:VR虚拟现实眼镜
2018/02/13 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
行政文员岗位职责
2013/11/08 职场文书
学年自我鉴定
2014/01/16 职场文书
教育科研先进个人材料
2014/01/26 职场文书
学校地质灾害防治方案
2014/06/10 职场文书
检讨书范文2000字
2015/01/28 职场文书
父母教会我观后感
2015/06/17 职场文书
2015年迎新晚会策划书
2015/07/16 职场文书
MySQL 全文索引使用指南
2021/05/25 MySQL
纯html+css实现打字效果
2021/08/02 HTML / CSS
零基础学java之循环语句的使用
2022/04/10 Java/Android