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 相关文章推荐
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
Feb 07 Javascript
jQuery新闻滚动插件 jquery.roller.js
Jun 27 Javascript
随窗体滑动的小插件sticky源码
Jun 21 Javascript
jQuery实现将页面上HTML标签换成另外标签的方法
Jun 09 Javascript
JS实现很实用的对联广告代码(可自适应高度)
Sep 18 Javascript
当jquery ajax遇上401请求的解决方法
May 19 Javascript
jQuery扩展_动力节点Java学院整理
Jul 05 jQuery
Angular中使用MathJax遇到的一些问题
Dec 15 Javascript
JavaScript中变量、指针和引用功能与操作示例
Aug 04 Javascript
小程序富文本提取图片可放大缩小
May 26 Javascript
vue Element左侧无限级菜单实现
Jun 10 Javascript
Element PageHeader页头的使用方法
Jul 26 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实现登陆验证码(类似条行码状)
2006/10/09 PHP
PHP中创建和验证哈希的简单方法实探
2015/07/06 PHP
PHP图片加水印实现方法
2016/05/06 PHP
PHP实现的最大正向匹配算法示例
2017/12/19 PHP
JavaScript静态的动态
2006/09/18 Javascript
document.compatMode的CSS1compat使用介绍
2014/04/03 Javascript
jQuery 中国省市两级联动选择附图
2014/05/14 Javascript
jQuery实现向下滑出的二级菜单效果实例
2015/08/22 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
JS+DIV+CSS实现的经典标签切换效果代码
2015/09/14 Javascript
javascript中字体浮动效果的简单实例演示
2015/11/18 Javascript
详解js中构造流程图的核心技术JsPlumb(2)
2015/12/08 Javascript
DataTables+BootStrap组合使用Ajax来获取数据并且动态加载dom的方法(排序,过滤,分页等)
2016/11/09 Javascript
Bootstrap轮播图的使用和理解4
2016/12/14 Javascript
详解nodejs的express如何自动生成项目框架
2017/07/12 NodeJs
解决bootstrap中下拉菜单点击后不关闭的问题
2018/08/10 Javascript
Jquery实现无缝向上循环滚动列表的特效
2019/02/13 jQuery
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
原生js实现移动小球(碰撞检测)
2020/12/17 Javascript
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
各个系统下的Python解释器相关安装方法
2015/10/12 Python
在CentOS6上安装Python2.7的解决方法
2018/01/09 Python
python创建学生成绩管理系统
2019/11/22 Python
Python中logging日志记录到文件及自动分割的操作代码
2020/08/05 Python
谈一谈HTML5本地存储技术
2016/03/02 HTML / CSS
德国大型和小型家用电器网上商店:Energeto
2019/05/15 全球购物
数据库什么时候应该被重组
2012/11/02 面试题
密封类可以有虚函数吗
2014/08/11 面试题
举例说明类变量和实例变量的区别
2016/06/30 面试题
高中毕业生个人自我鉴定
2013/11/24 职场文书
学生会干部自我鉴定2014
2014/09/18 职场文书
合伙经营协议书范本(通用版)
2014/12/03 职场文书
数学备课组工作总结
2015/08/12 职场文书
导游词之山西关帝庙
2019/11/01 职场文书
go原生库的中bytes.Buffer用法
2021/04/25 Golang