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 相关文章推荐
屏蔽Flash右键信息的js代码
Jan 17 Javascript
javascript实现可改变滚动方向的无缝滚动实例
Jun 17 Javascript
javascript中attribute和property的区别详解
Jun 05 Javascript
jQuery仿天猫实现超炫的加入购物车
May 04 Javascript
JS批量替换内容中关键词为超链接
Feb 20 Javascript
快速解决处理后台返回json数据格式的问题
Aug 07 Javascript
iview在vue-cli3如何按需加载的方法
Oct 31 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
Apr 22 Javascript
vue组件 keep-alive 和 transition 使用详解
Oct 11 Javascript
详解vue中v-on事件监听指令的基本用法
Jul 22 Javascript
详解vue中在父组件点击按钮触发子组件的事件
Nov 13 Javascript
uniapp 微信小程序 自定义tabBar 导航
Apr 22 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
PHP版本如何选择?应该使用哪个版本?
2015/05/13 PHP
php pdo操作数据库示例
2017/03/10 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
无阻塞加载脚本分析[全]
2011/01/20 Javascript
基于jquery的blockui插件显示弹出层
2011/04/14 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JavaScript等比例缩放图片控制超出范围的图片
2013/08/06 Javascript
父页面显示遮罩层弹出半透明状态的dialog
2014/03/04 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
JavaScript事件类型中焦点、鼠标和滚轮事件详解
2016/01/25 Javascript
AngularJS下对数组的对比分析
2016/08/24 Javascript
在 Angular2 中实现自定义校验指令(确认密码)的方法
2017/01/23 Javascript
angularjs+bootstrap菜单的使用示例代码
2017/03/07 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
使用Python中的线程进行网络编程的入门教程
2015/04/15 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python中asyncore异步模块的用法及实现httpclient的实例
2016/06/28 Python
python爬取w3shcool的JQuery课程并且保存到本地
2017/04/06 Python
使用python编写监听端
2018/04/12 Python
python中dict使用方法详解
2019/07/17 Python
python3的数据类型及数据类型转换实例详解
2019/08/20 Python
浅谈tensorflow中dataset.shuffle和dataset.batch dataset.repeat注意点
2020/06/08 Python
使用keras时input_shape的维度表示问题说明
2020/06/29 Python
Python经典五人分鱼实例讲解
2021/01/04 Python
纽约21世纪百货官网:Century 21
2016/08/27 全球购物
美国女孩洋娃娃店:American Girl
2017/10/24 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
物流管理专业大学生自荐信
2013/10/04 职场文书
本科毕业生的求职信范文
2013/11/20 职场文书
生物学学生自我评价
2014/01/17 职场文书
承诺书样本
2014/08/30 职场文书
java Nio使用NioSocket客户端与服务端交互实现方式
2021/06/15 Java/Android
美元符号 $
2022/02/17 杂记