开发者社区> zchd> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

Javascript的匿名函数

简介: 一、什么是匿名函数? 在Javascript定义一个函数一般有如下三种方式:函数关键字(function)语句:function fnMethodName(x){alert(x);}函数字面量(Function Literals):var fnMethodName = function(x){al...
+关注继续查看

一、什么是匿名函数?

在Javascript定义一个函数一般有如下三种方式:
函数关键字(function)语句:
function fnMethodName(x){alert(x);}
函数字面量(Function Literals):
var fnMethodName = function(x){alert(x);}
Function()构造函数:
var fnMethodName = new Function('x','alert(x);')
上面三种方法定义了同一个方法函数fnMethodName,第1种就是最常用的方法,后两种都是把一个函数复制给变量fnMethodName,而这个函数是没有名字的,即匿名函数。实际上,相当多的语言都有匿名函数。
二、函数字面量和Function()构造函数的区别

虽然函数字面量是一个匿名函数,但语法允许为其指定任意一个函数名,当写递归函数时可以调用它自己,使用Function()构造函数则不行。
var f = function fact(x) {
if (x < = 1) return 1;
else return x*fact(x-1);
};
Function()构造函数允许运行时Javascript代码动态的创建和编译。在这个方式上它类似全局函数eval()。
Function()构造函数每次执行时都解析函数主体,并创建一个新的函数对象。所以当在一个循环或者频繁执行的函数中调用Function()构造函数的效率是非常低的。相反,函数字面量却不是每次遇到都重新编译的。
用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);
}();
函数字面量:首先声明一个函数对象,然后执行它。
(function(){
alert(1);
} ) ( );
优先表达式:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。
( function(){
alert(2);
} ( ) );
Void操作符:用void操作符去执行一个没有用圆括号包围的一个单独操作数。
void function(){
alert(3);
}()
这三种方式是等同的,hedger wang因为个人原因比较喜欢第3种,而在实际应用中我看到的和使用的都是第1种。
四、匿名函数的应用

《Javascript的一种模块模式》中的第一句话就是“全局变量是魔鬼”。配合var关键字,匿名函数可以有效的保证在页面上写入Javascript,而不会造成全局变量的污染。这在给一个不是很熟悉的页面增加Javascript时非常有效,也很优美。实际上,YUI以及其相应的范例中大量使用匿名函数,其他的Javascript库中也不乏大量使用。
Javascript的函数式编程(functional programming)的基石。具体请看《用函数式编程技术编写优美的 JavaScript》和《函数式JavaScript编程指南》。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
理解下JavaScript中的匿名函数、自执行匿名函数
本文目录 1. 函数也是一种类型 2. 匿名函数 3. 自执行匿名函数 4. 小结
57 0
基于H5+css+JavaScript实现跳跳糖加载
基于H5+css+JavaScript实现跳跳糖加载
24 0
用纯JavaScript实现的微信二维码图片生成器
QRCode.js是javascript实现二维码(QRCode)制作生成库。 QRCode.js有着良好的跨浏览器兼容性(高版本使用HTML5的 Canvas,低版本IE使用table元素绘制),而且QRCode.js没有任何依赖。只需要引用一个JS。
1017 0
用原生javascript实现最简单的发布者-订阅者模式
http://www.cnblogs.com/surahe/p/6065778.html    发布—订阅模式可以广泛应用于异步编程中,这是一种替代传递回调函数的方案。比如,我们可以订阅 ajax 请求的 error 、 succ 等事件。
829 0
十大经典排序算法的 JavaScript 实现
  计算机领域的都多少掌握一点算法知识,其中排序算法是《数据结构与算法》中最基本的算法之一。排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
1135 0
JavaScript小效果的实现(笔记)
在学习一些JavaScript效果,做一些实现效果笔记,顺便整理一下思路。 LightBox效果实现: &lt;!DOCTYPE html&gt; &lt;meta charset="utf-8"&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;Lightbox效果&lt;/title&gt; &lt;style type="text/cs
1147 0
Javascript日期格式化指定格式的字符串实现
代码部分 TypeScript 1 /** 2 * format a Date object 3 * 将 Date 转化为指定格式的String 4 * @param {Date} date 源日期对象 5 * @param {string...
818 0
javascript实现中国各大城市快速下拉选择
如果开发中遇到需要输入城市名的页面,那么这个特效可以帮助快速输入。这是一个纯js实现的效果,可以快速的输入城市名称,支持鼠标点击选择,输入城市的拼音或者拼音首字母,使用方便。可以在输入框中通过点击生成包含中国各个城市的下拉列表,进行快速选择,快速切换定位。体验效果:http://hovertree.
2081 0
在Javascript中实现伪哈希表
了解数据结构的人应该都听说过哈希表这种数据结构,它是一种典型的利用键值对存储并检索数据的一种非线性结构,又称散列表或杂凑法。在一般的线性表结构中,数据的相对位置是随机的,即数据和用于检索的关键字之间不存在确定的关系,检索数据时往往需要进行一系列的比较,最终找到要检索的数据,这种方法往往建立在循环比较的机制上,利用时间的代价节省了空间,实现了数据的存储和检索功能。
865 0
JavaScript实现map
//定义map function Map() { this.container = {}; } //将key-value放入map中 Map.prototype.
606 0
+关注
zchd
架构,编程语言相关技术专家
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Javascript中的函数
立即下载
Javascript异步编程
立即下载
Javascript中的对象
立即下载