Javascript的匿名函数小结


Posted in Javascript onDecember 31, 2009

一、什么是匿名函数?

在Javascript定义一个函数一般有如下三种方式:

  1. 函数关键字(function)语句
    function fnMethodName(x){alert(x);}
  2. 函数字面量(Function Literals)
    var fnMethodName = function(x){alert(x);}
  3. Function()构造函数
    var fnMethodName = new Function('x','alert(x);')

上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。实际上,相当多的语言都有匿名函数

二、函数字面量和Function()构造函数的区别

  1. 虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。
    var f = function fact(x) {
     if (x < = 1) return 1;
     else return x*fact(x-1);
    };
  2. Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。
  3. Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。
  4. 用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,但我们平常所说的匿名函数均指采用函数字面量形式的匿名函数。更多详细内容可以阅读《JavaScript: The Definitive Guide, 5th Edition》的Functions那章。

三、匿名函数的代码模式

昨天hedger wang在他的blog介绍了几种匿名函数的代码模式

错误模式:其无法工作,浏览器会报语法错。

function(){
 alert(1);
}();
  1. 函数字面量:首先声明一个函数对象,然后执行它。
    (function(){
     alert(1);
    } ) ( );
  2. 优先表达式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。
    ( function(){
     alert(2);
    } ( ) );
  3. Void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。
    void function(){
     alert(3);
    }()

这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。

四、匿名函数的应用

  1. 《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。
  2. Javascript的函数式编程(functional programming)的基石。具体请看《用函数式编程技术编写优美的 JavaScript》《函数式JavaScript编程指南》
Javascript 相关文章推荐
如何用javascript控制上传文件的大小
Oct 26 Javascript
[转]JS宝典学习笔记
Feb 07 Javascript
Jquery操作radio的简单实例
Jan 06 Javascript
Javascript基础教程之函数对象和属性
Jan 18 Javascript
浅谈JavaScript中的String对象常用方法
Feb 25 Javascript
浏览器复制插件zeroclipboard使用指南
Mar 26 Javascript
微信小程序 loading 详解及实例代码
Nov 09 Javascript
ionic2打包android时gradle无法下载的解决方法
Apr 05 Javascript
详解Node全局变量global模块
Sep 28 Javascript
详解微信小程序缓存--缓存时效性
May 02 Javascript
js实现3D旋转相册
Aug 02 Javascript
jQuery zTree如何改变指定节点文本样式
Oct 16 jQuery
JavaScript 对Cookie 操作的封装小结
Dec 31 #Javascript
Javascript的闭包
Dec 31 #Javascript
javascript Onunload与Onbeforeunload使用小结
Dec 31 #Javascript
JavaScript 常用函数
Dec 30 #Javascript
jQuery的三种$()
Dec 30 #Javascript
jquery UI 1.72 之datepicker
Dec 29 #Javascript
用js做一个小游戏平台 (一)
Dec 29 #Javascript
You might like
十天学会php(1)
2006/10/09 PHP
PHP JS Ip地址及域名格式检测代码
2013/09/27 PHP
PHP页面实现定时跳转的方法
2014/10/31 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
php获取一定范围内取N个不重复的随机数
2016/05/28 PHP
php 使用fopen函数创建、打开文件详解及实例代码
2016/09/24 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
PHP异常类及异常处理操作实例详解
2018/12/19 PHP
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
JQuery与JS里submit()的区别示例介绍
2014/02/17 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
jQuery内容过滤选择器用法分析
2015/02/10 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
2015/10/23 Javascript
20行JS代码实现粘贴板复制功能
2018/02/06 Javascript
如何在vue里添加好看的lottie动画
2018/08/02 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
解决vue项目中出现Invalid Host header的问题
2020/11/17 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
详解Python中列表和元祖的使用方法
2015/04/25 Python
Django Admin 实现外键过滤的方法
2017/09/29 Python
详解django三种文件下载方式
2018/04/06 Python
Python3分析处理声音数据的例子
2019/08/27 Python
Python进程间通信 multiProcessing Queue队列实现详解
2019/09/23 Python
pandas分组聚合详解
2020/04/10 Python
python中scipy.stats产生随机数实例讲解
2021/02/19 Python
Python使用cn2an实现中文数字与阿拉伯数字的相互转换
2021/03/02 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
校园文化建设方案
2014/02/03 职场文书
人事部经理岗位职责
2014/03/07 职场文书
硕士研究生求职自荐信范文
2014/03/11 职场文书
竞争上岗演讲稿范文
2014/05/12 职场文书
解除财产保全担保书
2014/05/20 职场文书
企业党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
2014年教研组工作总结
2014/11/26 职场文书
Go各时间字符串使用解析
2021/04/02 Golang
Python万能模板案例之matplotlib绘制甘特图
2022/04/13 Python