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 快捷键设置实现代码
Mar 13 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 Javascript
JS连连看源码完美注释版(推荐)
Dec 09 Javascript
关于JavaScript对象的动态选择及遍历对象
Mar 10 Javascript
jquery滚动到顶部底部代码
Apr 20 Javascript
javascript常用的方法分享
Jul 01 Javascript
javascript文件加载管理简单实现方法
Jul 25 Javascript
详解JavaScript的Polymer框架中的通知交互
Jul 29 Javascript
JQuery菜单效果的两个实例讲解(3)
Sep 17 Javascript
JS实现网页上随滚动条滚动的层效果代码
Nov 04 Javascript
JavaScript基础之静态方法和实例方法分析
Dec 26 Javascript
为什么要使用Vuex的介绍
Jan 19 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
数据库相关问题
2006/10/09 PHP
php smarty截取中文字符乱码问题?gb2312/utf-8
2011/11/07 PHP
php中检查文件或目录是否存在的代码小结
2012/10/22 PHP
php查找任何页面上的所有链接的方法
2013/12/03 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
JSONP基础知识详解
2017/03/19 Javascript
BootStrap表单控件之复选框checkbox和单选择按钮radio
2017/05/23 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
实现div滚动条默认最底部以及默认最右边的示例代码
2017/11/15 Javascript
微信小程序自定义音乐进度条的实例代码
2018/08/28 Javascript
VeeValidate 的使用场景以及配置详解
2019/01/11 Javascript
用webpack4开发小程序的实现方法
2019/06/04 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
js的Object.assign用法示例分析
2020/03/05 Javascript
原生JS利用transform实现banner的无限滚动示例代码
2020/06/15 Javascript
一行JavaScript代码如何实现瀑布流布局
2020/12/11 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
python在控制台输出进度条的方法
2015/06/20 Python
python3第三方爬虫库BeautifulSoup4安装教程
2018/06/19 Python
python修改txt文件中的某一项方法
2018/12/29 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
python爬虫增加访问量的方法
2019/08/22 Python
python爬取王者荣耀全皮肤的简单实现代码
2020/01/31 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
详解Django中异步任务之django-celery
2020/11/05 Python
最新Python idle下载、安装与使用教程图文详解
2020/11/28 Python
奥地利汽车配件店:Pkwteile.at
2017/03/10 全球购物
优秀应届毕业生自荐信
2013/11/16 职场文书
管理失职检讨书
2014/02/12 职场文书
化学工程专业求职信
2014/08/10 职场文书
煤矿施工安全协议书
2016/03/22 职场文书
vue2实现provide inject传递响应式
2021/05/21 Vue.js
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Python实现简单的俄罗斯方块游戏
2021/09/25 Python
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL