一、什么是匿名函数?
在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中的匿名函数进行讲解,旨在帮助读者深入理解匿名函数的...
函数表达式如匿名函数和箭头函数提供了更多灵活性。 4. **对象与原型链**:JavaScript对象是键值对的集合,可以通过字面量语法或构造函数创建。原型链是JavaScript实现继承的方式,每个对象都有一个`__proto__`属性...
在上述代码中,我们使用了一个立即执行的匿名函数,这个函数访问并操作了`data`对象的属性,但不会影响到全局作用域。 闭包还常用于实现结果缓存,提高性能。当一个函数执行起来非常耗时时,我们可以利用闭包保存其...
首先,jQuery 的核心架构是基于一个立即执行的匿名函数。这种设计方式可以避免全局变量污染,提供一种模拟命名空间的效果。例如: ```javascript (function() { // 全部代码 })(); ``` 在匿名函数内部,jQuery 将其...
JavaScript中没有严格的命名空间,因此将所有代码包裹在一个匿名函数内,可以限制其作用域,防止与其他代码的命名冲突。 ```javascript (function(){ // ... })(); ``` 接下来,jQuery的主要对象`jQuery`被赋值给...
3. **函数**:函数定义、参数传递、返回值、匿名函数、箭头函数、函数表达式。 4. **对象与原型链**:对象创建、属性访问、方法调用、原型对象、原型链、构造函数、this关键字。 5. **数组操作**:数组方法(push...
书中详细讲解了函数表达式、匿名函数、箭头函数、`arguments`对象以及闭包的概念。 4. **原型与继承**:JavaScript的继承是基于原型链实现的。每个对象都有一个`__proto__`属性,指向其构造函数的原型对象。`Object...
通过以上对JavaScript函数的详细解读,我们能够更好地理解其背后的机制,并在实际开发中合理运用。函数是JavaScript编程的核心,掌握函数的定义、参数、作用域、闭包等概念,将有助于编写出更加高效和优雅的代码。
- 上述代码定义了一个匿名函数,并将其赋值给`foo`变量。 - 函数名`bar`在这个上下文中没有实际作用,因为该函数是通过`foo`来调用的。 - 调用`typeof(foo)`会返回`"function"`,表示`foo`是一个函数。 - 调用`...
- **匿名函数与递归**:探讨了匿名函数的应用场景,以及如何使用递归来解决问题。 - **函数作为对象**:介绍了函数可以作为变量存储和传递的特性。 - **存储函数**:讨论了如何将函数保存为变量或对象属性的方法。 -...
##### 3.1 匿名函数与立即执行 ```javascript (function() { // jQuery 代码 })(); ``` 这段代码定义了一个匿名函数,并立即执行。这意味着函数内的代码会在加载页面时立即运行。 ##### 3.2 命名空间 ```...
第三种方法,利用了JavaScript的匿名函数特性。具体代码如下: ```javascript function slows() { alert("15S后弹出!"); } setTimeout(function() { slows(); }, 5000); ``` 在这个例子中,我们没有直接传递函数...
- 为了增强插件的兼容性,并确保在其他库(如Zepto.js)存在的环境下也能正常工作,可以在自执行匿名函数中进一步封装: ```javascript ;(function ($, window, document, undefined) { // ... (与之前相同) })...
当检测到按键事件时,会执行一个匿名函数,在这个函数内部,首先通过兼容性处理获取当前的事件对象,然后判断是否按下了“Enter”键(键码为13),如果是,则调用`save()`函数并阻止默认行为。 1. **事件对象获取**...
在开发过程中,为了防止全局作用域的污染,需要将插件代码封装在自调用的匿名函数中,形成私有作用域。此外,为避免由于缺少分号导致的JavaScript错误,需要在函数后添加分号。这种方法不仅适用于jQuery插件,同样...
- 函数表达式(匿名或命名)不会被提升,只有其赋值操作被处理。 - 命名函数表达式(如`var f = function foo() {...}`)中的`foo`不会作为全局变量,只在函数内部可用。 了解Hoisting机制对于编写健壮的...
2. **立即执行函数表达式 (IIFE)**:用匿名函数包裹代码,立即执行并避免污染全局作用域,如 `(function() { /* code */ })();` 3. **对象解构**:利用`{}`和`[]`进行对象和数组的解构赋值,简化代码,例如: ```...
- **示例3**: 使用匿名函数,并立即执行它,弹出"示例3"。 ### 作用域与闭包 作用域决定了变量的可见性和生命周期。当函数被调用时,会创建一个新的作用域,该作用域中的变量可以被函数外部的闭包访问。 ### 闭包...