函数声明
函数 foo 将会在整个程序执行前被 hoist (提升),因此它在定义 foo 函数的整个 scope (作用域) 中都是可用的。
即使在函数定义之前调用它也没问题。
函数表达式
如果没有函数名的话,一定就是函数表达式,但是对于有函数名的情况该如何判断呢?
Javascript 规定如果整个函数体是作为表达式的一部分时,那么它就是函数表达式,否则即是函数声明。
匿名函数表达式
由于 var 是一个声明所以这里 对变量 foo 进行 hoist (提升),因此当程序执行时,变量 foo 是可调用的。
但是由于赋值语句只有在运行时才生效,所以变量 foo 的值为 undefined 。
命名函数表达式
在这里,命名函数 bar 赋值给了变量 foo ,所以在函数声明外是不可见的,但在 bar 函数内部仍然可以调用。
这是因为 Javascript 对命名函数处理的机制,函数的名称只有在函数内部的作用域中有效。
原文:http://www.cnblogs.com/nullObj/p/4909198.html