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关闭当前页面(窗口)的几种方式总结
Mar 05 Javascript
Js base64 加密解密介绍
Oct 11 Javascript
jQuery简易图片放大特效示例代码
Jun 09 Javascript
jQuery中change事件用法实例
Dec 26 Javascript
React中使用collections时key的重要性详解
Aug 07 Javascript
Node层模拟实现multipart表单的文件上传示例
Jan 02 Javascript
在vue中通过axios异步使用echarts的方法
Jan 13 Javascript
React如何避免重渲染
Apr 10 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
Jul 06 Javascript
详解Require.js与Sea.js的区别
Aug 05 Javascript
解决vue axios的封装 请求状态的错误提示问题
Sep 25 Javascript
Vue从TodoList中学父子组件通信
Feb 05 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数据库处理封装类实例
2016/12/24 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
2019/03/22 PHP
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
Extjs 几个方法的讨论
2010/01/28 Javascript
jQuery学习3:操作元素属性和特性
2010/02/07 Javascript
10条建议帮助你创建更好的jQuery插件
2015/05/18 Javascript
JS实现跟随鼠标的链接文字提示框效果
2015/08/06 Javascript
轻松学习jQuery插件EasyUI EasyUI实现拖动基本操作
2015/11/30 Javascript
js当前页面登录注册框,固定div,底层阴影的实例代码
2016/10/04 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
underscore之function_动力节点Java学院整理
2017/07/11 Javascript
bootstrap精简教程_动力节点Java学院整理
2017/07/14 Javascript
详解关于Angular4 ng-zorro使用过程中遇到的问题
2018/12/05 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
一文搞懂ES6中的Map和Set
2019/05/20 Javascript
JavaScript中break、continue和return的用法区别实例分析
2020/03/02 Javascript
使用JavaScript获取扫码枪扫描得到的条形码的思路代码详解
2020/06/10 Javascript
jquery实现简单拖拽效果
2020/07/20 jQuery
用Python的Flask框架结合MySQL写一个内存监控程序
2015/11/07 Python
Python文件和流(实例讲解)
2017/09/12 Python
Python装饰器用法实例总结
2018/05/26 Python
python子线程退出及线程退出控制的代码
2019/10/16 Python
Python基于xlutils修改表格内容过程解析
2020/07/28 Python
Django框架请求生命周期实现原理
2020/11/13 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
学校食堂采购员岗位职责
2013/12/05 职场文书
南京青奥会口号
2014/06/12 职场文书
2015年七一建党节演讲稿
2015/03/19 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
入党积极分子培养人意见
2015/06/02 职场文书
消费者投诉书范文
2015/07/02 职场文书
运动会主持人开幕词
2016/03/04 职场文书
写作技巧:如何撰写一份优秀的营销策划书
2019/08/13 职场文书
python 单机五子棋对战游戏
2022/04/28 Python