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实例教程(19) 使用HoTMetal(3)
Dec 23 Javascript
javascript 命名空间以提高代码重用性
Nov 13 Javascript
JS模拟的QQ面板上的多级可展开的菜单
Oct 10 Javascript
Jquery ajaxsubmit上传图片实现代码
Nov 04 Javascript
详解如何构建Angular项目目录结构
Jul 13 Javascript
Javascript实现跨域后台设置拦截的方法详解
Aug 04 Javascript
JavaScript实现的数字与字符串转换功能示例
Aug 23 Javascript
vue学习笔记之v-if和v-show的区别
Sep 20 Javascript
Element-ui tree组件自定义节点使用方法代码详解
Sep 17 Javascript
基于vue实现web端超大数据量表格的卡顿解决
Apr 02 Javascript
vue+element-ui+axios实现图片上传
Aug 20 Javascript
JS实现刷新网页后之前浏览位置保持不变示例详解
Aug 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代码保护--Zend Guard的使用详解
2013/06/03 PHP
laravel5.6 框架操作数据 Eloquent ORM用法示例
2020/01/26 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
js中 关于undefined和null的区别介绍
2013/04/16 Javascript
iframe父页面获取子页面参数的方法
2014/02/21 Javascript
JQuery调用绑定click事件的3种写法
2015/03/28 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
浅谈javascript中的三种弹窗
2016/10/21 Javascript
webpack常用配置项配置文件介绍
2016/11/07 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
JQuery事件冒泡和默认行为代码实例
2020/05/13 jQuery
python求列表交集的方法汇总
2014/11/10 Python
深入理解Python中的元类(metaclass)
2015/02/14 Python
深入理解Python单元测试unittest的使用示例
2017/11/18 Python
Python基于PyGraphics包实现图片截取功能的方法
2017/12/21 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
Python画柱状统计图操作示例【基于matplotlib库】
2018/07/04 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
Django 404、500页面全局配置知识点详解
2020/03/10 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
Linux如何修改文件和文件夹的权限
2013/09/05 面试题
农民工工资承诺书范文
2014/03/31 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
校园文明倡议书
2014/05/16 职场文书
正科级干部考察材料
2014/05/29 职场文书
公司收款委托书范本
2014/09/20 职场文书
中学生逃课检讨书
2015/02/17 职场文书
高中团支书竞选稿
2015/11/21 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
教你怎么用Python监控愉客行车程
2021/04/29 Python