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控件的相对独立性
Sep 03 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
Feb 25 Javascript
js/jquery判断浏览器类型的方法小结
May 12 Javascript
深入理解JavaScript的React框架的原理
Jul 02 Javascript
JS实现兼容性较好的随屏滚动效果
Nov 09 Javascript
jQuery 如何给Carousel插件添加新的功能
Apr 18 Javascript
基于AngularJS实现iOS8自带的计算器
Sep 12 Javascript
微信小程序使用navigateTo数据传递的实例
Sep 26 Javascript
JS如何实现封装列表右滑动删除收藏按钮
Jul 23 Javascript
js+canvas实现五子棋小游戏
Aug 02 Javascript
Vue 同步异步存值取值实现案例
Aug 05 Javascript
node.js 基于 STMP 协议和 EWS 协议发送邮件
Feb 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中经典方法实现判断多维数组是否为空
2011/10/23 PHP
国产PHP开发框架myqee新手快速入门教程
2014/07/14 PHP
android上传图片到PHP的过程详解
2015/08/03 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
accesskey 提交
2006/06/26 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
js取模(求余数)隔行变色
2014/05/15 Javascript
IE6/IE7中JavaScript json提示缺少标识符、字符串或数字问题处理
2014/12/16 Javascript
js分页工具实例
2015/01/28 Javascript
javascript实现Table排序的方法
2015/05/15 Javascript
JavaScript数组去重的五种方法
2015/11/05 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
基于Angularjs+mybatis实现二级评论系统(仿简书)
2017/02/13 Javascript
js实现4个方向滚动的球
2017/03/06 Javascript
解决VUEX刷新的时候出现数据消失
2017/07/03 Javascript
iview table render集成switch开关的实例
2018/03/14 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
详解elementui之el-image-viewer(图片查看器)
2019/08/30 Javascript
js实现特别简单的钟表效果
2020/09/14 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
Python快速查找list中相同部分的方法
2018/06/27 Python
利用Python进行数据可视化常见的9种方法!超实用!
2018/07/11 Python
详解python 爬取12306验证码
2019/05/10 Python
python selenium 执行完毕关闭chromedriver进程示例
2019/11/15 Python
Python3 io文本及原始流I/O工具用法详解
2020/03/23 Python
英国现代市场:ARKET
2019/04/10 全球购物
巴西宠物商店:Cobasi
2019/04/19 全球购物
Elizabeth Gage官网:英国最好的珠宝设计之一
2020/09/26 全球购物
可靠的数据流传输TCP
2016/03/15 面试题
仓管员岗位职责范文
2013/11/08 职场文书
党的群众路线教育实践活动总结报告
2014/04/28 职场文书
文明演讲稿范文
2014/05/12 职场文书
幼师小班个人总结
2015/02/12 职场文书
区域销售经理岗位职责
2015/04/02 职场文书
python获取淘宝服务器时间的代码示例
2021/04/22 Python