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 相关文章推荐
js RuntimeObject() 获取ie里面自定义函数或者属性的集合
Nov 23 Javascript
jquery通过a标签删除table中的一行的代码
Dec 02 Javascript
简介JavaScript中的getSeconds()方法的使用
Jun 10 Javascript
Bootstrap中datetimepicker使用小结
Dec 28 Javascript
JS+HTML5实现图片在线预览功能
Jul 22 Javascript
基于Vue实现页面切换左右滑动效果
Jun 29 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
Sep 14 Javascript
Vue实现拖放排序功能的实例代码
Jul 08 Javascript
node.js express框架简介与实现
Jul 23 Javascript
微信小程序本地存储实现每日签到、连续签到功能
Oct 09 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
Dec 06 Javascript
jQuery实现手风琴特效
Jan 11 jQuery
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
PHP实现将科学计数法转换为原始数字字符串的方法
2014/12/16 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
BOOM vs RR BO5 第四场 2.14
2021/03/10 DOTA
JavaScript事件列表解说
2006/12/22 Javascript
JQuery模板插件 jquery.tmpl 动态ajax扩展
2011/11/10 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
JS 添加千分位与去掉千分位的示例
2013/07/11 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
Jq通过td获取同行其它列td的方法
2016/10/05 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
angularjs使用directive实现分页组件的示例
2017/02/07 Javascript
JavaScript实现二分查找实例代码
2017/02/22 Javascript
fullPage.js和CSS3实现全屏滚动效果
2017/05/05 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
Vue项目引发的「过滤器」使用教程
2019/03/12 Javascript
详解vue 图片上传功能
2019/04/30 Javascript
koa+mongoose实现简单增删改查接口的示例代码
2019/05/13 Javascript
Swiper.js实现移动端元素左右滑动
2019/09/08 Javascript
vue框架中props的typescript用法详解
2020/02/17 Javascript
JS函数参数的传递与同名参数实例分析
2020/03/16 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
一篇不错的Python入门教程
2007/02/08 Python
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
详解python列表生成式和列表生成式器区别
2019/03/27 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python 解压、复制、删除 文件的实例代码
2020/02/26 Python
Python递归实现打印多重列表代码
2020/02/27 Python
在Mac中配置Python虚拟环境过程解析
2020/06/22 Python
必须要使用游标的SQL语句有那些
2012/05/07 面试题
优秀经理事迹材料
2014/02/01 职场文书
四年级下册教学反思
2014/02/01 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
公司经理聘任书
2014/03/29 职场文书
师德师风自查总结
2014/10/14 职场文书
公司开业的祝贺语大全(60条)
2019/07/05 职场文书
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python