转自:http://www.jb51.net/article/21670.htm
一、什么是匿名函数?
在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函数的一些关键知识点,包括基本语法、参数处理以及函数的返回值,特别是关于JavaScript匿名函数的理解。 首先,我们来看看JavaScript函数的基本语法。一个函数定义通常以`function`关键字...
- 函数表达式:匿名函数或命名函数,如`var func = function() {}`。 - 回调函数:作为参数传递的函数,常用于异步操作。 - 闭包:能够访问自身作用域、外部作用域以及全局作用域的函数。 - `arguments`对象:在...
函数表达式通常指的是将匿名函数赋值给变量。这种情况下,变量的作用域遵循变量作用域的规则。变量必须在函数表达式被定义后才能使用,否则会引发未定义的错误。例如: ```javascript bar(5); // 这会导致未定义...
JavaScript 函数定义有多种方式,包括通过关键字function定义、使用Function构造函数以及函数直接量(也称匿名函数表达式)。这些方法在语法和使用场景上有所区别。 1. 关键字function定义函数: 这是最常见的一种...
3.3.1 匿名函数 3.3.2 显式声明 3.3.3 手工触发 3.4 事件处理器的返回值 3.5 事件处理器设置的灵活性 3.6 现代事件模型与Event对象 3.7 IE4中的Event对象 3.7.1 对象属性 3.7.2 事件上溯 3.7.3 阻止事件上溯 3.7.4 ...
1.3.6 匿名函数 1.3.7 作用域解析和闭包 1.3.8 迭代对象 1.3.9 函数的调用和引用(不带括号) 1.4 实例:WYSIWYGJavaScript翻转图 1.5 小结 第2章 创建可重用的对象 2.1 对象...
在JavaScript事件学习小结(二)中,主要探讨的是如何处理这些事件,即事件处理程序。事件处理程序是当特定事件发生时执行的函数,如用户点击按钮或页面加载完成。以下是关于JavaScript事件处理程序的详细解释: 1. *...
本文将探讨如何通过JavaScript来封装对Cookie的操作,同时介绍匿名函数、闭包以及如何模拟私有(private)和公共(public)访问权限的概念。 首先,让我们关注JavaScript中的匿名函数。匿名函数是指没有名称的函数...
本文将对JavaScript中常见的陷阱进行小结,以帮助开发者在项目中避免这些潜在问题。 首先,需要明确的是JavaScript中的大小写敏感性。这意味着在编写JavaScript代码时,所有变量名、函数名以及对象属性名都是区分大...
3.3.1 匿名函数 3.3.2 显式声明 3.3.3 手工触发 3.4 事件处理器的返回值 3.5 事件处理器设置的灵活性 3.6 现代事件模型与Event对象 3.7 IE4中的Event对象 3.7.1 对象属性 3.7.2 事件上溯 3.7.3 阻止事件上溯 3.7.4 ...
闭包(Closures)是匿名函数的一种延伸,它允许访问定义它们的词法作用域中的变量,但与JavaScript中的闭包相比,PHP的闭包功能相对较弱。 嵌套函数是在一个父函数体内部定义的函数。在PHP中,内部函数通常不能访问...
具名函数表达式是在赋值时指定函数名,而匿名函数表达式则没有名称。函数表达式赋值给变量后,变量名实际上指向了函数对象。示例如下: ```javascript // 具名函数表达式 var greet = function greeting(greeting, ...
在这个例子中,`function() {return 123}` 是一个匿名函数表达式,因为它没有名称。这种情况下,`b` 是一个变量,它存储了这个匿名函数的引用。函数表达式不会被预解析,它们遵循常规的变量声明规则,即变量提升...
这里,`callLater` 函数利用闭包,返回了一个匿名函数,该匿名函数能够访问外部函数`callLater`的参数。调用`callLater`并传入参数后,我们可以得到一个可以延迟执行的函数引用,并将这个引用传递给`setTimeout`: ...