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异步跨域访问代码
Jun 28 Javascript
Android中的jQuery:AQuery简介
May 06 Javascript
javascript获取隐藏元素(display:none)的高度和宽度的方法
Jun 06 Javascript
一个JavaScript处理textarea中的字符成每一行实例
Sep 22 Javascript
jQuery实现伸展与合拢panel的方法
Apr 30 Javascript
在AngularJS应用中实现一些动画效果的代码
Jun 18 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
Dec 01 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
Dec 28 Javascript
javascript简写常用的12个技巧(可以大大减少你的js代码量)
Mar 28 Javascript
vue router 通过路由来实现切换头部标题功能
Apr 24 Javascript
Element Breadcrumb 面包屑的使用方法
Jul 26 Javascript
一文秒懂JavaScript构造函数、实例、原型对象以及原型链
Aug 25 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
玩转虚拟域名◎+ .
2006/10/09 PHP
使用无限生命期Session的方法
2006/10/09 PHP
用PHP和ACCESS写聊天室(十)
2006/10/09 PHP
PHP新手上路(四)
2006/10/09 PHP
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
php中使用parse_url()对网址进行解析的实现代码(parse_url详解)
2012/01/03 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
2016/05/31 PHP
php array 转json及java 转换 json数据格式操作示例
2019/11/13 PHP
php 使用expat方式解析xml文件操作示例
2019/11/26 PHP
使用jQuery解决IE与FireFox下createElement方法的差异
2013/11/14 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
详解使用nvm安装node.js
2017/07/18 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
详解vue挂载到dom上会发生什么
2019/01/20 Javascript
vue组件开发props验证的实现
2019/02/12 Javascript
小程序实现长按保存图片的方法
2019/12/31 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
python迭代器实例简析
2014/09/25 Python
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
python numpy 显示图像阵列的实例
2018/07/02 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
pyqt5 QlistView列表显示的实现示例
2020/03/24 Python
python中slice参数过长的处理方法及实例
2020/12/15 Python
python函数超时自动退出的实操方法
2020/12/28 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
Banana Republic欧盟:美国都市简约风格的代表品牌
2018/05/09 全球购物
施工工地安全标语
2014/06/07 职场文书
武夷山导游词
2015/02/03 职场文书
药房管理制度范本
2015/08/06 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书