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 相关文章推荐
可输入的下拉框
Jun 19 Javascript
prototype Element学习笔记(篇二)
Oct 26 Javascript
让你的网站可编辑的实现js代码
Oct 19 Javascript
加载 Javascript 最佳实践
Oct 30 Javascript
深入理解MVC中的时间js格式化
May 19 Javascript
基于canvas的二维码邀请函生成插件
Feb 14 Javascript
vue中页面跳转拦截器的实现方法
Aug 23 Javascript
vue获取input输入值的问题解决办法
Oct 17 Javascript
JavaScript常见JSON操作实例分析
Aug 08 Javascript
koa源码中promise的解读
Nov 13 Javascript
迅速了解一下ES10中Object.fromEntries的用法使用
Mar 05 Javascript
使用next.js开发网址缩短服务的方法
Jun 17 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
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
composer.lock文件的作用
2016/02/03 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
js去字符串前后空格5种实现方法及比较
2013/04/03 Javascript
JavaScript中自定义事件用法分析
2014/12/23 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
JS中超越现实的匿名函数用法实例分析
2019/06/21 Javascript
在小程序中推送模板消息的实现方法
2019/07/22 Javascript
JavaScript进阶(一)变量声明提升实例分析
2020/05/09 Javascript
JS中的继承操作实例总结
2020/06/06 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
python读写文件操作示例程序
2013/12/02 Python
python文件和目录操作方法大全(含实例)
2014/03/12 Python
使用Python3中的gettext模块翻译Python源码以支持多语言
2015/03/31 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
Python爬取某平台短视频的方法
2021/02/08 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
100%有机精油,美容油:House of Pure Essence
2018/10/30 全球购物
皇家阿尔伯特英国官方商店:Royal Albert骨瓷
2019/03/25 全球购物
PHP两种查询函数array/row的区别
2013/06/03 面试题
党校自我鉴定范文
2013/10/02 职场文书
采购部部长岗位职责
2014/02/06 职场文书
2015年小学生国庆节演讲稿
2015/07/30 职场文书
800字作文之大雪
2019/12/04 职场文书
详解Python中的for循环
2022/04/30 Python
Docker部署Mysql8的实现步骤
2022/07/07 Servers