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 显示当前系统时间代码
Dec 28 Javascript
JS面向对象编程之对象使用分析
Aug 19 Javascript
js setTimeout 常见问题小结
Aug 13 Javascript
jQuery设置与获取HTML,文本和值的简单实例
Feb 26 Javascript
浅谈JavaScript中的字符编码转换问题
Jul 07 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
Oct 31 Javascript
JavaScript深度复制(deep clone)的实现方法
Feb 19 Javascript
jQuery Raty 一款不错的星级评分插件
Aug 24 Javascript
js实现点击图片自动提交action的简单方法
Oct 16 Javascript
微信小程序页面开发注意事项整理
May 18 Javascript
详解让sublime text3支持Vue语法高亮显示的示例
Sep 29 Javascript
vue 接口请求地址前缀本地开发和线上开发设置方式
Aug 13 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
超强分页类2.0发布,支持自定义风格,默认4种显示模式
2007/01/02 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
ThinkPHP3.1.3版本新特性概述
2014/06/19 PHP
php图片裁剪函数
2018/10/31 PHP
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
$.each与$().each的区别示例介绍
2014/03/20 Javascript
使用FlexiGrid实现Extjs表格效果方法分享
2014/12/16 Javascript
jquery移动点击的项目到列表最顶端的方法
2015/06/24 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
vue.js实现简单轮播图效果
2017/10/10 Javascript
浅谈Vue内置component组件的应用场景
2018/03/27 Javascript
微信小程序实现人脸识别
2018/05/25 Javascript
ng-alain表单使用方式详解
2018/07/10 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
优化Vue中date format的性能详解
2020/01/13 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
浅谈python中的getattr函数 hasattr函数
2016/06/14 Python
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
详解Numpy中的广播原则/机制
2018/09/20 Python
python判断完全平方数的方法
2018/11/13 Python
python实现感知器算法(批处理)
2019/01/18 Python
python实现获取单向链表倒数第k个结点的值示例
2019/10/24 Python
Django如何使用jwt获取用户信息
2020/04/21 Python
Tensorflow实现将标签变为one-hot形式
2020/05/22 Python
基于Tensorflow的MNIST手写数字识别分类
2020/06/17 Python
Python常用库Numpy进行矩阵运算详解
2020/07/21 Python
保安自我鉴定范文
2013/12/08 职场文书
少先队入队活动方案
2014/02/08 职场文书
作风建设演讲稿
2014/05/23 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
毕业设计致谢词
2015/05/14 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
如何用JS实现网页瀑布流布局
2021/04/24 Javascript
MySQL中distinct与group by之间的性能进行比较
2021/05/26 MySQL
数据分析数据库ClickHouse在大数据领域应用实践
2022/04/03 MySQL