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获取当页面上鼠标光标位置和触发事件的对象的代码
Dec 09 Javascript
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
jQuery列表拖动排列具体实现
Nov 04 Javascript
自定义jquery模态窗口插件无法在顶层窗口显示问题
May 29 Javascript
jQuery实现炫酷的鼠标轨迹特效
Feb 01 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
May 03 Javascript
JavaScript中定时控制Throttle、Debounce和Immediate详解
Nov 17 Javascript
JS实现的加减乘除四则运算计算器示例
Aug 09 Javascript
jsonp跨域及实现百度首页联想功能的方法
Aug 30 Javascript
webpack项目使用eslint建立代码规范实现
May 16 Javascript
深入理解JavaScript 箭头函数
May 30 Javascript
Vue2.x和Vue3.x的双向绑定原理详解
Nov 05 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
PHP中的array数组类型分析说明
2010/07/27 PHP
php使用Smarty的相关注意事项及访问变量的几种方式
2011/12/08 PHP
PHP输出时间差函数代码
2013/01/28 PHP
PHP实现文件上传和多文件上传
2015/12/24 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
tp5.1 框架查询表达式用法详解
2020/05/25 PHP
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
JavaScript版的TwoQueues缓存模型
2014/12/29 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
基于jQuery实现的QQ表情插件
2015/08/25 Javascript
基于jquery实现省市联动特效
2015/12/17 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
JavaScript实现图像模糊化的方法实例
2017/01/15 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
Angularjs 根据一个select的值去设置另一个select的值方法
2018/08/13 Javascript
nodejs读取本地中文json文件出现乱码解决方法
2018/10/10 NodeJs
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
在Mac OS上搭建Python的开发环境
2015/12/24 Python
Django中使用celery完成异步任务的示例代码
2018/01/23 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python实现京东订单推送到测试环境,提供便利操作示例
2019/08/09 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
惠普美国官方商店:HP Official Store
2016/08/28 全球购物
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
家庭睡衣和家庭用品:Little Blue House
2018/03/18 全球购物
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
成品仓管员岗位职责
2013/12/11 职场文书
广告词串烧
2014/03/19 职场文书
企业宣传工作方案
2014/06/02 职场文书
2014年党建工作汇报材料
2014/10/27 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
史上最牛的辞职信
2015/02/28 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
Python操作CSV格式文件的方法大全
2021/07/15 Python