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解密入门之凭直觉解
Jun 25 Javascript
JavaScript入门教程(6) Window窗口对象
Jan 31 Javascript
JS获取父节点方法
Aug 20 Javascript
单击浏览器右上角的X关闭窗口弹出提示的小例子
Jun 12 Javascript
使用JavaScript的ActiveXObject对象检测应用程序是否安装的方法
Apr 15 Javascript
教你如何在 Javascript 文件里使用 .Net MVC Razor 语法
Jul 23 Javascript
浅谈JavaScript中指针和地址
Jul 26 Javascript
Bootstrap Validator 表单验证
Jul 25 Javascript
微信小程序 picker-view 组件详解及简单实例
Jan 10 Javascript
javascript获取select值的方法完整实例
Jun 20 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
Jul 17 Javascript
Vant+postcss-pxtorem 实现浏览器适配功能
Feb 05 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
基于PHP+MySQL的聊天室设计
2006/10/09 PHP
php中XMLHttpRequest(Ajax)不能设置自定义的Referer的解决方法
2011/11/26 PHP
php+ajax做仿百度搜索下拉自动提示框(有实例)
2012/08/21 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
php中final关键字用法分析
2016/12/07 PHP
兼容ie和firefox js关闭代码
2008/12/11 Javascript
js 获取子节点函数 (兼容FF与IE)
2010/04/18 Javascript
js 遍历对象的属性的代码
2011/12/29 Javascript
html超链接打开窗口大小的方法
2013/03/05 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
nodejs爬虫抓取数据乱码问题总结
2015/07/03 NodeJs
js鼠标点击按钮切换图片-图片自动切换-点击左右按钮切换特效代码
2015/09/02 Javascript
jQuery动画效果实现图片无缝连续滚动
2016/01/12 Javascript
微信小程序 教程之wxapp 视图容器 view
2016/10/19 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
vue实现a标签点击高亮方法
2018/03/17 Javascript
详解angular应用容器化部署
2018/08/14 Javascript
了解JavaScript中的选择器
2019/05/24 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
vue 动态表单开发方法案例详解
2019/12/02 Javascript
序列化模块json代码实例详解
2020/03/03 Javascript
angula中使用iframe点击后不执行变更检测的问题
2020/05/10 Javascript
JavaScript本地储存:localStorage、sessionStorage、cookie的使用
2020/10/13 Javascript
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
widows下安装pycurl并利用pycurl请求https地址的方法
2018/10/15 Python
python 重命名轴索引的方法
2018/11/10 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
python2.7 安装pip的方法步骤(管用)
2019/05/05 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
列车长先进事迹材料
2014/01/25 职场文书
乡镇法制宣传日活动总结
2015/05/05 职场文书