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 相关文章推荐
js 得到文件后缀(通过正则实现)
Jul 08 Javascript
jquery 实现两Select 标签项互调示例代码
Sep 25 Javascript
使用jquery组件qrcode生成二维码及应用指南
Feb 22 Javascript
JavaScript中使用Callback控制流程介绍
Mar 16 Javascript
BootstrapValidator不触发校验的实现代码
Sep 28 Javascript
浅谈EasyUI常用控件的禁用方法
Nov 09 Javascript
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
Apr 19 Javascript
vue2.0之多页面的开发的示例
Jan 30 Javascript
Vuex 快速入门(简单易懂)
Sep 20 Javascript
微信小程序实现下拉菜单切换效果
Mar 30 Javascript
在 Angular-cli 中使用 simple-mock 实现前端开发 API Mock 接口数据模拟功能的方法
Nov 28 Javascript
Vue的H5页面唤起支付宝支付功能
Apr 18 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求小于1000的所有水仙花数的代码
2012/01/10 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
调整PHP的性能
2013/10/30 PHP
PHP简单实现数字分页功能示例
2016/08/24 PHP
PHP 中常量的知识整理
2017/04/14 PHP
php post json参数的传递和接收处理方法
2018/05/31 PHP
thinkPHP3.2使用RBAC实现权限管理的实现
2019/08/27 PHP
23个超流行的jQuery相册插件整理分享
2011/04/25 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
JS实现获取键盘按下的按键并显示在页面上的方法
2015/11/04 Javascript
window.onerror()的用法与实例分析
2016/01/27 Javascript
JS基于ocanvas插件实现的简单画板效果代码(附demo源码下载)
2016/04/05 Javascript
javascript三种代码注释方法
2016/06/02 Javascript
新入门node.js必须要知道的概念(必看篇)
2016/08/10 Javascript
JavaScript中数组slice和splice的对比小结
2016/09/22 Javascript
Bootstrap基本组件学习笔记之input输入框组(9)
2016/12/07 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
jquery实现轮播图效果
2017/02/13 Javascript
详解react使用react-bootstrap当轮子造车
2017/08/15 Javascript
vue router+vuex实现首页登录验证判断逻辑
2018/05/17 Javascript
vue基于element-ui的三级CheckBox复选框功能的实现代码
2018/10/15 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
Python写的服务监控程序实例
2015/01/31 Python
python3学习之Splash的安装与实例教程
2018/07/09 Python
python变量赋值方法(可变与不可变)
2019/01/12 Python
Python中@property的理解和使用示例
2019/06/11 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
学术会议欢迎词
2014/01/09 职场文书
优秀求职信
2014/05/29 职场文书
商务经理岗位职责
2014/08/03 职场文书
离婚代理词范文
2015/05/23 职场文书
2016年暑假家长对孩子评语
2015/12/01 职场文书
2019年自助餐厅创业计划书模板
2019/08/22 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS