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 multibox 全选
Mar 22 Javascript
学习JavaScript设计模式(单例模式)
Nov 26 Javascript
javascript HTML5文件上传FileReader API
Mar 27 Javascript
js实现String.Fomat的实例代码
Sep 02 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
Nov 06 Javascript
详解vue前后台数据交互vue-resource文档
Jul 19 Javascript
代码详解JS操作剪贴板
Feb 11 Javascript
JS文件中加载jquery.js的实例代码
May 05 jQuery
详解Ubuntu安装angular-cli遇到的坑
Sep 08 Javascript
node微信开发之获取access_token+自定义菜单
Mar 17 Javascript
利用Electron简单撸一个Markdown编辑器的方法
Jun 10 Javascript
Angular.JS读取数据库数据调用完整实例
Jul 02 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
解决MySQL中文输出变成问号的问题
2008/06/05 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
php对文件夹进行相关操作(遍历、计算大小)
2015/11/04 PHP
JavaScript 开发规范要求(图文并茂)
2010/06/11 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
JS画5角星方法介绍
2013/09/17 Javascript
限制textbox或textarea输入字符长度的JS代码
2013/10/16 Javascript
使用AngularJS对路由进行安全性处理的方法
2015/06/18 Javascript
js判断移动端是否安装某款app的多种方法
2015/12/18 Javascript
JavaScript使用delete删除数组元素用法示例【数组长度不变】
2017/01/17 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
jquery实现图片跟随鼠标的实例
2017/10/17 jQuery
基于node.js实现微信支付退款功能
2017/12/19 Javascript
Vue-cropper 图片裁剪的基本原理及思路讲解
2018/04/17 Javascript
vue v-model动态生成详解
2018/06/30 Javascript
如何使用50行javaScript代码实现简单版的call,apply,bind
2019/08/14 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
用vite搭建vue3应用的实现方法
2021/02/22 Vue.js
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
Python中多线程及程序锁浅析
2015/01/21 Python
python实现自动发送报警监控邮件
2018/06/21 Python
Python+PyQt5实现美剧爬虫可视工具的方法
2019/04/25 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
2019/05/16 Python
Python批量查询关键词微信指数实例方法
2019/06/27 Python
python实现矩阵和array数组之间的转换
2019/11/29 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
阿根廷网上配眼镜:SmartBuyGlasses阿根廷
2016/08/19 全球购物
佳能德国网上商店:Canon德国
2017/03/18 全球购物
公务员年总结的自我评价
2013/10/25 职场文书
大学军训感想
2014/02/12 职场文书
离婚协议书格式
2015/01/26 职场文书
开国大典观后感
2015/06/04 职场文书
公司食堂管理制度
2015/08/05 职场文书
2016小学教师读书心得体会
2016/01/13 职场文书
HR必备:销售经理聘用合同范本
2019/08/21 职场文书