在变量作用域方面,函数声明和函数表达式有什么区别?
函数声明
- function foo() {}
-
函数 foo 将会在整个程序执行前被 hoist (提升),因此它在定义 foo 函数的整个 scope (作用域) 中都是可用的。
-
即使在函数定义之前调用它也没问题。
函数表达式
如果没有函数名的话,一定就是函数表达式,但是对于有函数名的情况该如何判断呢?
Javascript 规定如果整个函数体是作为表达式的一部分时,那么它就是函数表达式,否则即是函数声明。
- //简而言之,只有下面这样的写法才是函数声明,其他的写法统统都是函数表达式
- function 函数名(){
- //函数体
- }
匿名函数表达式
- var foo = function() {};
- //上面的例子将一个匿名函数赋值给了变量 foo
- foo; // 'undefined'
- foo(); // this raises a TypeErrorvar
- foo = function() {};
-
由于 var 是一个声明所以这里 对变量 foo 进行 hoist (提升),因此当程序执行时,变量 foo 是可调用的。
-
但是由于赋值语句只有在运行时才生效,所以变量 foo 的值为 undefined 。
命名函数表达式
- var foo = function bar() {
- bar(); // 可以在函数内部调用(实际使用时一定要设置退出条件)
- };
- bar(); // ReferenceError
-
在这里,命名函数 bar 赋值给了变量 foo ,所以在函数声明外是不可见的,但在 bar 函数内部仍然可以调用。
-
这是因为 Javascript 对命名函数处理的机制,函数的名称只有在函数内部的作用域中有效。
-