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 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
在IE浏览器中resize事件执行多次的解决方法
Jul 12 Javascript
JS实现向表格行添加新单元格的方法
Mar 30 Javascript
JavaScript中指定函数名称的相关方法
Jun 04 Javascript
jQuery模拟黑客帝国矩阵效果实例
Jun 28 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
May 26 Javascript
javascript基础知识
Jun 07 Javascript
JS控件bootstrap suggest plugin使用方法详解
Mar 25 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
Sep 16 Javascript
聊聊Vue 中 title 的动态修改问题
Jun 11 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
Dec 27 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判断变量类型常用方法
2012/04/24 PHP
PHP用函数嵌入网站访问量计数器
2017/10/27 PHP
php+ajax实现商品对比功能示例
2019/04/13 PHP
yii2.0框架使用 beforeAction 防非法登陆的方法分析
2019/09/11 PHP
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
jquery实现的网页自动播放声音
2014/04/30 Javascript
JavaScript数组的一些奇葩行为
2016/01/25 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
Javascript中 带名 匿名 箭头函数的重要区别(推荐)
2017/01/29 Javascript
在JS中如何把毫秒转换成规定的日期时间格式实例
2017/05/11 Javascript
初探js和简单隐藏效果的实例
2017/11/23 Javascript
讲解vue-router之什么是动态路由
2018/05/28 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
原生js实现Flappy Bird小游戏
2018/12/24 Javascript
JSON stringify方法原理及实例解析
2020/10/23 Javascript
javascript实现点击小图显示大图
2020/11/29 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
Python中str is not callable问题详解及解决办法
2017/02/10 Python
python的mysqldb安装步骤详解
2017/08/14 Python
Django实现全文检索的方法(支持中文)
2018/05/14 Python
Python3.4 tkinter,PIL图片转换
2018/06/21 Python
python检测IP地址变化并触发事件
2018/12/26 Python
python numpy库linspace相同间隔采样的实现
2020/02/25 Python
python 读取二进制 显示图片案例
2020/04/24 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
Python中常见的数制转换有哪些
2020/05/27 Python
python属于哪种语言
2020/08/16 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
新西兰第一的行李箱网站:luggage.co.nz
2019/07/22 全球购物
高中生物教学反思
2014/02/05 职场文书
入党积极分子评语
2014/05/04 职场文书
2014年秋季开学典礼主持词
2014/08/02 职场文书
基层党组织整改方案
2014/10/25 职场文书
公司股东出资证明书
2014/11/01 职场文书