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 函数对象的多重身份
Jun 28 Javascript
jquery tools 系列 scrollable(2)
Sep 06 Javascript
JavaScript日期类型的一些用法介绍
Mar 02 Javascript
jquery图片滚动放大代码分享(2)
Aug 28 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 Javascript
jQuery EasyUI框架中的Datagrid数据表格组件结构详解
Jun 09 Javascript
jquery删除table当前行的实例代码
Oct 07 Javascript
jQuery自定义组件(导入组件)
Nov 08 Javascript
JavaScript中Array对象用法实例总结
Nov 29 Javascript
使用Browserify来实现CommonJS的浏览器加载方法
May 14 Javascript
js实现转动骰子模型
Oct 24 Javascript
vue实现跳转接口push 转场动画示例
Nov 01 Javascript
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
屏蔽浏览器缓存另类方法
2006/10/09 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
PHP模板引擎Smarty中变量的使用方法示例
2016/04/11 PHP
自制PHP框架之模型与数据库
2017/05/07 PHP
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
Jquery中对数组的操作代码
2011/08/12 Javascript
jQuery弹性滑动导航菜单实现思路及代码
2013/05/02 Javascript
js代码实现的加入收藏效果并兼容主流浏览器
2014/06/23 Javascript
JavaScript实现在数组中查找不同顺序排列的字符串
2014/09/26 Javascript
在浏览器中打开或关闭JavaScript的方法
2015/06/03 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
jquery中的常见问题及快速解决方法小结
2016/06/14 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
Bootstrap CSS组件之下拉菜单(dropdown)
2016/12/17 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
vue 实现axios拦截、页面跳转和token 验证
2018/07/17 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
vue element中axios下载文件(后端Python)
2019/05/10 Javascript
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
Python数据结构dict常用操作代码实例
2020/03/12 Python
python实现图像外边界跟踪操作
2020/07/13 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
Java的基础面试题附答案
2016/01/10 面试题
C/C++有关内存的思考题
2015/12/04 面试题
学生周末回家住宿长期请假条
2014/02/15 职场文书
小学毕业典礼主持词
2014/03/27 职场文书
行政专员求职信范文
2014/05/03 职场文书
团队精神的演讲稿
2014/05/14 职场文书
刑事和解协议书范本
2014/11/19 职场文书
爱情保证书
2015/01/17 职场文书
单位租车协议书
2015/01/29 职场文书
2015年五一劳动节演讲稿
2015/03/18 职场文书