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操作cookie的函数代码
Oct 03 Javascript
js关于精确计算和数值格式化以及直接引js文件
Jan 28 Javascript
jQuery+html5实现div弹出层并遮罩背景
Apr 15 Javascript
javascript制作的滑动图片菜单
May 15 Javascript
简单封装js的dom查询实例代码
Jul 08 Javascript
浅谈javascript alert和confirm的美化
Dec 15 Javascript
BootStrap的select2既可以查询又可以输入的实现代码
Feb 17 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
Jul 20 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
微信小程序实现action-sheet弹出底部菜单功能【附源码下载】
Dec 09 Javascript
jQuery.validate.js表单验证插件的使用代码详解
Oct 22 jQuery
Vue解决移动端弹窗滚动穿透问题
Dec 15 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
CI框架中cookie的操作方法分析
2014/12/12 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
ExtJs 3.1 XmlTreeLoader Example Error
2010/02/09 Javascript
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
Javascript中的getter和setter初识
2017/08/17 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
vue中动态添加class类名的方法
2018/09/05 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
vue2.0 路由模式mode="history"的作用
2018/10/18 Javascript
WebSocket的简单介绍及应用
2019/05/23 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
vue实现在线预览pdf文件和下载(pdf.js)
2019/11/26 Javascript
ant design pro中可控的筛选和排序实例
2020/11/17 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
解决Python出现_warn_unsafe_extraction问题的方法
2016/03/24 Python
python3实现UDP协议的服务器和客户端
2017/06/14 Python
Python基于TCP实现会聊天的小机器人功能示例
2018/04/09 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
Flask之请求钩子的实现
2018/12/23 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
tensorflow 自定义损失函数示例代码
2020/02/05 Python
Django设置Postgresql的操作
2020/05/14 Python
django rest framework 过滤时间操作
2020/07/12 Python
Html5 APP中监听返回事件处理的方法示例
2018/03/15 HTML / CSS
解析浏览器的一些“滚动”行为鉴赏
2019/09/16 HTML / CSS
Peter Millar官网:美国高档生活服饰品牌
2018/07/02 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
汽车销售顾问求职自荐信
2014/01/01 职场文书
优秀校长事迹材料
2014/12/24 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
Go语言-为什么返回值为接口类型,却返回结构体
2021/04/24 Golang
Python经常使用的一些内置函数
2022/04/11 Python