JavaScript中匿名函数的用法及优缺点详解


Posted in Javascript onJune 01, 2016

匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。

这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。

一、什么是匿名函数?

在Javascript定义一个函数一般有如下三种方式:

函数关键字(function)语句:

function fnMethodName(x){alert(x);}

函数字面量(Function Literals):

var fnMethodName = function(x){alert(x);}

Function()构造函数:

var fnMethodName = new Function('x','alert(x);')

上面三种方法定义了同一个方法函数fnMethodName,

第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。

实际上,相当多的语言都有匿名函数。

二、函数字面量和Function()构造函数的区别

虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。

var f = function fact(x) { if (x < = 1) return 1; else return x*fact(x-1); };

Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。

Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。

用Function()构造函数创建一个函数时并不遵循典型的作用域,它一直把它当作是顶级函数来执行。

var y = "global";

function constructFunction() { var y = "local"; return new Function("return y"); // 无法获取局部变量 } alert(constructFunction()()); // 输出 “global”和函数关键字定义相比Function()构造器有自己的特点且要难以使用的多,

所以这项技术通常很少使用。

而函数字面量表达式和函数关键字定义非常接近。

考虑前面的区别,虽然有消息说字面量的匿名函数在OS X 10.4.3下的某些webkit的引擎下有bug,

但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。

三、匿名函数的代码模式

错误模式:其无法工作,浏览器会报语法错。

function(){ alert(1); }();

函数字面量:首先声明一个函数对象,然后执行它。

(function(){ alert(1); } ) ( );

优先表达式:

( function(){ alert(2); } ( ) );

void操作符:

void function(){ alert(3); }()这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。

四、匿名函数的应用

《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。

配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。

这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。

实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。

Javascript的函数式编程(functional programming)的基石。

具体请看《用函数式编程技术编写优美的 JavaScript》和《函数式JavaScript编程指南》。

以上这篇JavaScript中匿名函数的用法及优缺点详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript &amp; DHTML 实例编程(教程)(三)初级实例篇1—上传文件控件实例
Jun 02 Javascript
JavaScript prototype属性使用说明
May 13 Javascript
js不能跳转到上一页面的问题解决方法
Mar 01 Javascript
jquery中的$(document).ready()使用小结
Feb 14 Javascript
JavaScript的21条基本知识点
Mar 04 Javascript
js制作简易年历完整实例
Jan 28 Javascript
jQuery的ajax中使用FormData实现页面无刷新上传功能
Jan 16 Javascript
Javascript中构造函数要注意的一些坑
Jan 23 Javascript
js实现年月日表单三级联动
Apr 17 Javascript
JS检测window.open打开的窗口是否关闭
Jun 25 Javascript
node中使用es5/6以及支持性与性能对比
Aug 11 Javascript
5分钟学会Vue动画效果(小结)
Jul 21 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
Jun 01 #Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 #Javascript
JS未跨域操作iframe里的DOM
Jun 01 #Javascript
jQuery实现的简单分页示例
Jun 01 #Javascript
jQuery简单实现上下,左右滑动的方法
Jun 01 #Javascript
jQuery实现背景弹性滚动的导航效果
Jun 01 #Javascript
jQuery Chart图表制作组件Highcharts用法详解
Jun 01 #Javascript
You might like
用C/C++扩展你的PHP 为你的php增加功能
2012/09/06 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
php查询whois信息的方法
2015/06/08 PHP
Locate a File Using a File Open Dialog Box
2007/06/18 Javascript
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
ExtJS 设置级联菜单的默认值
2010/06/13 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
JS获取键盘上任意按键的值(实例代码)
2013/11/12 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
JavaScript的ExtJS框架中表格的编写教程
2016/05/21 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
AngularJS实现根据不同条件显示不同控件
2017/04/20 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
python实现给字典添加条目的方法
2014/09/25 Python
利用Python中的mock库对Python代码进行模拟测试
2015/04/16 Python
自己编程中遇到的Python错误和解决方法汇总整理
2015/06/03 Python
深入解析Python的Tornado框架中内置的模板引擎
2016/07/11 Python
详解python开发环境搭建
2016/12/16 Python
Python3.X 线程中信号量的使用方法示例
2017/07/24 Python
Python编程pygal绘图实例之XY线
2017/12/09 Python
使用TensorFlow实现SVM
2018/09/06 Python
Numpy中对向量、矩阵的使用详解
2019/10/29 Python
numpy创建单位矩阵和对角矩阵的实例
2019/11/29 Python
Python手绘可视化工具cutecharts使用实例
2019/12/05 Python
Tensorflow 多线程与多进程数据加载实例
2020/02/05 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
Python 找出出现次数超过数组长度一半的元素实例
2020/05/11 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
应届毕业生自荐信
2015/03/04 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
python 实现图与图之间的间距调整subplots_adjust
2021/05/21 Python