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 相关文章推荐
extjs tabpanel限制选项卡数量实现思路及代码
Apr 02 Javascript
jquery div拖动效果示例代码
Dec 08 Javascript
jqeury-easyui-layout问题解决方法
Mar 24 Javascript
javascript打开word文档的方法
Apr 16 Javascript
jQuery动画特效实例教程
Aug 29 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
Aug 21 Javascript
JSON 数据详解及实例代码分析
Jan 20 Javascript
jQuery 改变P标签文本值方法
Feb 24 jQuery
vue项目tween方法实现返回顶部的示例代码
Mar 02 Javascript
vue组件间通信六种方式(总结篇)
May 15 Javascript
微信小程序自定义tabbar custom-tab-bar 6s出不来解决方案(cover-view不兼容)
Nov 01 Javascript
vue-router结合vuex实现用户权限控制功能
Nov 14 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数组输出html表格的方法
2014/02/24 PHP
PHP实现小偷程序实例
2016/10/31 PHP
火狐浏览器(firefox)下获得Event对象以及keyCode
2008/11/13 Javascript
jquery对单选框,多选框,文本框等常见操作小结
2014/01/08 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
2015/03/04 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
使用jQuery.Qrcode插件在客户端动态生成二维码并添加自定义Logo
2016/09/01 Javascript
js完整倒计时代码分享
2016/09/18 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
详解webpack 如何集成第三方js库
2017/06/29 Javascript
JavaScript数据结构之单链表和循环链表
2017/11/28 Javascript
详解使用jQuery.i18n.properties实现js国际化
2018/05/04 jQuery
layui自定义插件citySelect实现省市区三级联动选择
2019/07/26 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
Vue实现图片轮播组件思路及实例解析
2020/05/11 Javascript
跟老齐学Python之大话题小函数(2)
2014/10/10 Python
Python实现的破解字符串找茬游戏算法示例
2017/09/25 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
世界上最悠久的自行车制造商:Ribble Cycles
2017/03/18 全球购物
薇姿法国官网:Vichy法国
2021/01/28 全球购物
大学生毕业自我鉴定范文
2013/11/03 职场文书
计算机软件个人的自荐信范文
2013/12/01 职场文书
大一自我鉴定范文
2013/12/27 职场文书
科技开发中心办公室主任岗位责任制
2014/02/10 职场文书
领导班子遵守党的政治纪律情况对照检查材料
2014/09/26 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书
掌握一个领域知识,高效学习必备方法
2019/08/08 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
详解Python中的进程和线程
2021/06/23 Python
Redis 操作多个数据库的配置的方法实现
2022/03/23 Redis
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏