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身份证验证超强脚本
Oct 26 Javascript
js AspxButton的客户端操作
Jun 26 Javascript
IE6下通过a标签点击切换图片的问题
Nov 14 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
Nov 25 Javascript
javascript弹出窗口实现代码
Nov 12 Javascript
JavaScript利用HTML DOM进行文档操作的方法
Mar 28 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
Aug 17 Javascript
微信小程序 loading(加载中提示框)实例
Oct 28 Javascript
移动适配的几种方案(三种方案)
Nov 25 Javascript
JavaScript实现自动跳转文本功能
May 25 Javascript
jQuery查找和过滤_动力节点节点Java学院整理
Jul 04 jQuery
解决vue项目 build之后资源文件找不到的问题
Sep 12 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 空格,换行,跳格使用说明
2009/12/18 PHP
ThinkPHP实现批量删除数据的代码实例
2014/07/02 PHP
Yii2框架实现注册和登录教程
2016/09/30 PHP
php输出形式实例整理
2020/05/05 PHP
JQUBAR1.1 jQuery 柱状图插件发布
2010/11/28 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
解决javascript:window.close()在chrome,Firefox下失效的问题
2013/05/07 Javascript
div+css+js实现无缝滚动类似marquee无缝滚动兼容firefox
2013/08/29 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
jQuery实现跨域iframe接口方法调用
2015/03/14 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
javascript适合移动端的日期时间拾取器
2015/11/10 Javascript
JQuery日期插件datepicker的使用方法
2016/03/03 Javascript
JavaScript仿百度图片浏览效果
2016/11/23 Javascript
jQuery使用正则表达式替换dom元素标签用法示例
2017/01/16 Javascript
Vue.js实战之Vuex的入门教程
2017/04/01 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
vue实现简单全选和反选功能
2020/09/15 Javascript
在Python中操作字典之fromkeys()方法的使用
2015/05/21 Python
深入解析Python中的变量和赋值运算符
2015/10/12 Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
python中matplotlib的颜色及线条控制的示例
2018/03/16 Python
python去除扩展名的实例讲解
2018/04/23 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
keras 获取某层的输入/输出 tensor 尺寸操作
2020/06/10 Python
详解Python中的文件操作
2021/01/14 Python
大学生关于奋斗的演讲稿
2014/01/09 职场文书
旷课检讨书3000字
2014/02/04 职场文书
幼儿园植树节活动总结
2014/07/04 职场文书
乡镇机关党员民主评议表自我评价
2014/09/21 职场文书
义诊活动总结
2015/02/04 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
军训心得体会范文(2016最新篇)
2016/01/11 职场文书
Python中的xlrd模块使用整理
2021/06/15 Python