函数表达式和函数声明
函数声明(Function Declaration):
- 形如
function <function_name> () {}
,四个元素缺一不可 - 不能够是表达式的其中一部分
- 形如
函数表达式(Function Expression):
- 最常见的形式:
var func = function () {}
- 函数表达式一般是赋值表达式的一部分,不能单独存在。
- 有时候,会给函数加上名字,像这样
var func = function f() {}
,但这实际上没什么用,跟用匿名函数赋值var func = function() {}
是一样的。1
2var func = function f() {};
f(); // Uncaught ReferenceError: f is not defined - 还有一种函数表达式,存在于自执行函数(self-invoking function)中。比如,下面这种形式,也是函数表达式。
1
2
3(function sayHello() {
alert("hello!");
})();
- 最常见的形式:
两者之间的异同
- 同:这两个方法都能创建出一个函数,并且这个函数的名字都叫
foo
- 异:
- 函数声明的方法,存在变量提升的情况,也就是会将这个函数声明提升到作用域最前面。于是,在函数声明前,就能调用这个函数。
函数表达式的方法,其实也存在变量提升的情况,只不过先声明,但给这个变量赋值为undefined
。在函数声明前调用这个函数就会报错。1
2
3
4
5
6
7
8
9
10(function () {
a(); // a
b(); // Uncaught TypeError: b is not a function
function a() {
console.log("a");
} // 函数声明
var b = function () {
console.log("b");
}; // 函数表达式
})(); - 用函数声明的方法定义的函数,可以被放入执行环境的变量对象(Variable Object)中;而函数表达式定义的函数,不会被放入执行变量的
- 函数声明的方法,存在变量提升的情况,也就是会将这个函数声明提升到作用域最前面。于是,在函数声明前,就能调用这个函数。