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 相关文章推荐
js最简单的拖拽效果实现代码
Sep 24 Javascript
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
js整数字符串转换为金额类型数据(示例代码)
Dec 26 Javascript
js限制文本框只能输入中文的方法
Aug 11 Javascript
JS随机打乱数组的方法小结
Jun 22 Javascript
jQuery实现鼠标滚动图片延迟加载效果附源码下载
Jun 28 Javascript
Angular 4.x中表单Reactive Forms详解
Apr 25 Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 Javascript
浅谈JavaScript闭包
Apr 09 Javascript
vue之组件内监控$store中定义变量的变化详解
Nov 08 Javascript
js刷新页面location.reload()用法详解
Dec 09 Javascript
nuxt.js服务端渲染中axios和proxy代理的配置操作
Nov 06 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
浅谈apache和nginx的rewrite的区别
2013/02/22 PHP
php画图实例
2014/11/05 PHP
PHP简单实现HTTP和HTTPS跨域共享session解决办法
2015/05/27 PHP
php正则表达式学习笔记
2015/11/13 PHP
PHP chop()函数讲解
2019/02/11 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
jquery阻止后续事件只执行第一个事件
2014/07/24 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
AngularJs IE Compatibility 兼容老版本IE
2016/09/01 Javascript
JS两种类型的表单提交方法实例分析
2016/11/28 Javascript
JS加密插件CryptoJS实现的DES加密示例
2018/08/16 Javascript
React router动态加载组件之适配器模式的应用详解
2018/09/12 Javascript
使用Vue开发自己的Chrome扩展程序过程详解
2019/06/21 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
vue 动态设置img的src地址无效,npm run build 后找不到文件的解决
2020/07/26 Javascript
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
Python中的字符串类型基本知识学习教程
2016/02/04 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
使用python编写监听端
2018/04/12 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
python统计字符串中字母出现次数代码实例
2020/03/02 Python
Keras-多输入多输出实例(多任务)
2020/06/22 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
使用分层画布来优化HTML5渲染的教程
2015/05/08 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
西班牙品牌鞋子、服装和配饰在线商店:Esdemarca
2021/02/17 全球购物
小学教师管理制度
2014/01/18 职场文书
小学生期末自我鉴定
2014/01/19 职场文书
教师考察材料范文
2014/06/03 职场文书
励志演讲稿大全
2014/08/21 职场文书
统计学教授推荐信
2014/09/18 职场文书
机关干部四风问题自查报告及整改措施
2014/10/26 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
goland设置颜色和字体的操作
2021/05/05 Golang