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注入技巧
Jun 22 Javascript
用JQuery 实现AJAX加载XML并解析的脚本
Jul 25 Javascript
JS TextArea字符串长度限制代码集合
Oct 31 Javascript
基于jQuery实现复选框的全选 全不选 反选功能
Nov 24 Javascript
使用jQuery实现返回顶部
Jan 26 Javascript
IE浏览器下PNG相关功能
Jul 05 Javascript
JS模拟简易滚动条效果代码(附demo源码)
Apr 05 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
Jul 13 jQuery
js实现图片跟随鼠标移动效果
Oct 16 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
js canvas实现五子棋小游戏
Jan 22 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
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 serialize()与unserialize()的用法
2013/06/05 PHP
PHP实现带重试功能的curl连接示例
2016/07/28 PHP
PHP mysqli事务操作常用方法分析
2017/07/22 PHP
PHP递归实现文件夹的复制、删除、查看大小操作示例
2017/08/11 PHP
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
2016/01/21 Javascript
JQuery导航菜单选择特效
2016/04/11 Javascript
jQuery+json实现动态创建复杂表格table的方法
2016/10/25 Javascript
Vue列表页渲染优化详解
2017/07/24 Javascript
Cropper.js 实现裁剪图片并上传(PC端)
2017/08/20 Javascript
JavaScrip数组删除特定元素的几种方法总结
2017/09/06 Javascript
利用原生js实现html5小游戏之打砖块(附源码)
2018/01/03 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
vue-cli项目修改文件热重载失效的解决方法
2018/09/19 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
[原创]微信小程序获取网络类型的方法示例
2019/03/01 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
JS实现动态倒计时功能(天数、时、分、秒)
2019/12/12 Javascript
vue项目打包之开发环境和部署环境的实现
2020/04/23 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
[46:58]完美世界DOTA2联赛PWL S3 Forest vs LBZS 第一场 12.17
2020/12/19 DOTA
python实现报表自动化详解
2017/11/16 Python
Python框架Flask的基本数据库操作方法分析
2018/07/13 Python
python得到电脑的开机时间方法
2018/10/15 Python
python简易实现任意位数的水仙花实例
2018/11/13 Python
Python3中lambda表达式与函数式编程讲解
2019/01/14 Python
python网络应用开发知识点浅析
2019/05/28 Python
python字符串下标与切片及使用方法
2020/02/13 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
Pamela Love官网:纽约设计师Pamela Love的精美、时尚和穿孔珠宝
2020/10/19 全球购物
写好求职应聘自荐信的三部曲
2013/09/21 职场文书
幼儿园教师的考核评语
2014/04/18 职场文书
小学教育见习总结
2015/06/23 职场文书
Python读取文件夹下的所有文件实例代码
2021/04/02 Python
Python time库的时间时钟处理
2021/05/02 Python
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
改造DE1103三步曲
2022/04/07 无线电