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 相关文章推荐
FLASH 广告之外的链接
Dec 16 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
Jul 29 Javascript
设为首页加入收藏兼容360/火狐/谷歌/IE等主流浏览器的代码
Mar 26 Javascript
jQuery实现图片信息的浮动显示实例代码
Aug 28 Javascript
瀑布流布局代码一例
Apr 11 Javascript
基于jQuery实现弹出可关闭遮罩提示框实例代码
Jul 18 Javascript
Javascript vue.js表格分页,ajax异步加载数据
Oct 24 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
Nov 18 Javascript
基于Javascript倒计时效果
Dec 22 Javascript
深入浅析Vue中的Prop
Jun 10 Javascript
小程序和web画三角形实现解析
Sep 02 Javascript
简单了解JavaScript arguement原理及作用
May 28 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下使用无限生命期Session的方法
2007/03/16 PHP
PHP gbk环境下json_dencode传送来的汉字
2012/11/13 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
php弹出对话框实现重定向代码
2014/01/23 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
详解PHP的Yii框架中的Controller控制器
2016/03/29 PHP
微信支付PHP SDK ―― 公众号支付代码详解
2016/09/13 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
2017/08/01 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
分享js粘帖屏幕截图到web页面插件screenshot-paste
2020/08/21 Javascript
js实现多图左右切换功能
2016/08/04 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
React父子组件间的传值的方法
2018/11/13 Javascript
详解a标签添加onclick事件的几种方式
2019/03/29 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
JS异步处理的进化史深入讲解
2019/08/25 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
实现vuex原理的示例
2020/10/21 Javascript
关于你不想知道的所有Python3 unicode特性
2014/11/28 Python
利用python的socket发送http(s)请求方法示例
2018/05/07 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
纯CSS3绘制打火机动画火焰效果
2016/07/18 HTML / CSS
维珍澳洲航空官网:Virgin Australia
2017/09/08 全球购物
中国高端家电购物商城:顺电
2018/03/04 全球购物
附答案的Java面试题
2012/11/19 面试题
局域网标准
2016/09/10 面试题
公司端午节活动方案
2014/02/04 职场文书
网页美工求职信范文
2014/04/17 职场文书
银行求职自荐信
2014/06/30 职场文书
我们的节日元宵节活动总结
2015/02/06 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015年信息技术教研组工作总结
2015/07/22 职场文书
2016年小学圣诞节活动总结
2016/03/31 职场文书