转载:http://www.nowamagic.net/librarys/veda/detail/1663
函数表达式(缩写为FE)是这样一种函数:
- 在源码中须出现在表达式的位置
- 有可选的名称
- 不会影响变量对象
- 在代码执行阶段创建
这种函数类型的主要特点在于它在源码中总是处在表达式的位置。最简单的一个例子就是一个赋值声明:
1 |
var foo = function () {
|
2 |
...
|
3 |
}; |
该例演示是让一个匿名函数表达式赋值给变量foo,然后该函数可以用foo这个名称进行访问——foo()。
同时和定义里描述的一样,函数表达式也可以拥有可选的名称:
1 |
var foo = function _foo() {
|
2 |
...
|
3 |
}; |
需要注意的是,在外部FE通过变量“foo”来访问——foo(),而在函数内部(如递归调用),有可能使用名称“_foo”。
如果FE有一个名称,就很难与FD区分。但是,如果你明白定义,区分起来就简单明了:FE总是处在表达式的位置。在下面的例子中我们可以看到各种ECMAScript 表达式:
1 |
// 圆括号(分组操作符)内只能是表达式 |
2 |
( function foo() {});
|
3 |
|
4 |
// 在数组初始化器内只能是表达式 |
5 |
[ function bar() {}];
|
6 |
|
7 |
// 逗号也只能操作表达式 |
8 |
1, function baz() {};
|
表达式定义里说明:FE只能在代码执行阶段创建而且不存在于变量对象中,让我们来看一个示例行为:
1 |
// FE在定义阶段之前不可用(因为它是在代码执行阶段创建) |
2 |
alert(foo); // "foo" 未定义
|
3 |
( function foo() {});
|
4 |
|
5 |
// 定义阶段之后也不可用,因为他不在变量对象VO中 |
6 |
alert(foo); // "foo" 未定义
|
相当一部分问题出现了,我们为什么需要函数表达式?答案很明显——在表达式中使用它们,”不会污染”变量对象。最简单的例子是将一个函数作为参数传递给其它函数。
01 |
function foo(callback) {
|
02 |
callback();
|
03 |
} |
04 |
|
05 |
foo( function bar() {
|
06 |
alert( 'foo.bar' );
|
07 |
}); |
08 |
|
09 |
foo( function baz() {
|
10 |
alert( 'foo.baz' );
|
11 |
}); |
在上述例子里,FE赋值给了一个变量(也就是参数),函数将该表达式保存在内存中,并通过变量名来访问(因为变量影响变量对象),如下:
1 |
var foo = function () {
|
2 |
alert( 'foo' );
|
3 |
}; |
4 |
|
5 |
foo(); |
另外一个例子是创建封装的闭包从外部上下文中隐藏辅助性数据(在下面的例子中我们使用FE,它在创建后立即调用):
01 |
var foo = {};
|
02 |
03 |
( function initialize() {
|
04 |
var x = 10;
|
05 |
foo.bar = function () {
|
06 |
alert(x);
|
07 |
};
|
08 |
})(); |
09 |
|
10 |
foo.bar(); // 10;
|
11 |
alert(x); // "x" 未定义
|
我们看到函数foo.bar(通过[[Scope]]属性)访问到函数initialize的内部变量“x”。同时,“x”在外部不能直接访问。在许多库中,这种策略常用来创建”私有”数据和隐藏辅助实体。在这种模式中,初始化的FE的名称通常被忽略:
1 |
( function () {
|
2 |
// 初始化作用域
|
3 |
})(); |
还有一个例子是:在代码执行阶段通过条件语句进行创建FE,不会污染变量对象VO。
1 |
var foo = 10;
|
2 |
|
3 |
var bar = (foo % 2 == 0
|
4 |
? function () { alert(0); }
|
5 |
: function () { alert(1); }
|
6 |
); |
7 |
|
8 |
bar(); // 0
|
相关推荐
EXCEL函数公式解惑专集EXCEL函数公式解惑专集
EXCEL函数公式解惑专贴 因为不能明白公式的含义,碰到类似问题自己还难以举一反三应用甚至连一点小改动都需要再次求助;对函数公式略知一二者因不明公式含义不易拓展思路 各种问题的综合汇总
EXCEL函数公式解惑专贴.CHM+Excel函数速查.chm+VBA入门参考手册.chm+实例xls文件,打包上传,入门学习的好资料。
java解惑java解惑java解惑java解惑java解惑java解惑
Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑Java解惑
chm电子书,内容详实,解答细致,不管是初学者还是涉足EXCEL的老鸟,都会在此电子书中感受良多,强烈推荐。
SQL解惑(第2版)
Java解惑.pdf Java解惑.pdf Java解惑.pdf Java解惑.pdf
解惑SQL
《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》《Java解惑》
JAVA解惑.pdf JAVA解惑.pdf JAVA解惑.pdf
Java解惑中文版 Java解惑 java健壮程序
IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书 IT 学生解惑经典指导书
也许有人看过java解惑,即通过讲述一个案例,解释一个java特性抑或一个容易遇到的小陷阱。SQL解惑与其相同,通过小小案例解析、阐述SQL各个特性,比刻板而唠叨的教科书更小巧、便捷,焕然一新。
IT解惑,内容包括IT学生解惑真经、程序员羊皮卷、高质量c编程指南,其中涉及计算机专业学生的大学生活该如何度过,及求职的相关注意事项和C语言编程的一些经验。
扫描完整版 解惑大数据 解惑大数据 解惑大数据 解惑大数据
JAVA面试题解惑系列合集 JAVA面试题解惑系列合集 JAVA面试题解惑系列合集
C语言解惑中文版.pdf 扫描版
《Java解惑》 布洛克 著;陈昊鹏 译 扫描清晰带目录,仅供参阅,请支持正版
创新性地从“错误”的角度出发进行讲授,通过对比程序的对错、程序的好坏,使读者具备编制高质量程序的能力从对比程序的对错到对比程序的质量,循序渐进地引领读者成为编程高手。