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 相关文章推荐
兼容IE和Firefox的javascript获取iframe文档内容的函数
Aug 15 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
Sep 05 Javascript
javascript创建对象的几种模式介绍
May 06 Javascript
Bootstrap页面缩小变形的快速解决办法
Feb 03 Javascript
jquery仿京东商品放大浏览页面
Jun 06 jQuery
JS解决position:sticky的兼容性问题的方法
Oct 17 Javascript
详解vue + vuex + directives实现权限按钮的思路
Oct 24 Javascript
echarts设置图例颜色和地图底色的方法实例
Aug 01 Javascript
vue.js编译时给生成的文件增加版本号
Sep 17 Javascript
Vue.js标签页组件使用方法详解
Oct 19 Javascript
Vue.js实现大屏数字滚动翻转效果
Nov 29 Javascript
webpack打包html里面img后src为“[object Module]”问题
Dec 22 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
如何将一个表单同时提交到两个地方处理
2006/10/09 PHP
15种PHP Encoder的比较
2007/03/06 PHP
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
PHP中preg_match函数正则匹配的字符串长度问题
2015/05/27 PHP
php 判断IP为有效IP地址的方法
2018/01/28 PHP
javascript实现炫酷的拖动分页
2015/05/11 Javascript
js跨域请求的5中解决方式
2015/07/02 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
浅谈jquery点击label触发2次的问题
2016/06/12 Javascript
js利用正则表达式检验输入内容是否为网址
2016/07/05 Javascript
js css+html实现简单的日历
2016/07/14 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
js实现年月日表单三级联动
2020/04/17 Javascript
微信小程序与php 实现微信支付的简单实例
2017/06/23 Javascript
javascript+jQuery实现360开机时间显示效果
2017/11/03 jQuery
vue-cli开发时,关于ajax跨域的解决方法(推荐)
2018/02/03 Javascript
vue实现的树形结构加多选框示例
2019/02/02 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
Python 中pandas.read_excel详细介绍
2017/06/23 Python
python不换行之end=与逗号的意思及用途
2017/11/21 Python
Kali Linux安装ipython2 和 ipython3的方法
2019/07/11 Python
python实现点击按钮修改数据的方法
2019/07/17 Python
python+tifffile之tiff文件读写方式
2020/01/13 Python
Python如何根据时间序列数据作图
2020/05/12 Python
java关于string最常出现的面试题整理
2021/01/18 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
广州盈通面试题
2015/12/05 面试题
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
汽车驾驶求职信
2013/10/25 职场文书
安全承诺书范文
2014/03/26 职场文书
五分钟演讲稿
2014/04/30 职场文书
2014党的群众路线教育实践活动总结报告
2014/10/31 职场文书
自我推荐信怎么写
2015/03/24 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python