函数表达式和函数声明~(自己的记录)
在ECMAScript中,创建函数的最常用的两个方法是函数表达式和函数声明,两者期间的区别是有点晕,ECMA的规范明确了一点~函数声明必须带有标示符 (Identifier)就是大家说的(函数名),而函数表达式则可以省略函数名。
那么没有函数名那肯定就是函数表达式了,那么有函数名时,如何区分它是函数表达式还是函数声明呢~~如果是作为赋值表达式的一部分则为函数表达式,如果是包含在一个函数体内,或者位于程序的最顶部的话则作为函数声明~
function foo(){} // 声明,因为它是程序的一部分 var bar = function foo(){}; // 表达式,因为它是赋值表达式的一部分 new function bar(){}; // 表达式,因为它是new表达式 (function(){ function bar(){} // 声明,因为它是函数体的一部分 })();
差别:
表达式和声明的差别很小~声明是先于任何表达式解析和计算之前的~
命名函数表达式(有函数名的函数表达式)
提到命名函数表达式,理所当然,就是它得有名字,前面的例子var bar = function foo(){};就是一个有效的命名函数表达式,但有一点需要记住:这个名字只在新定义的函数作用域内有效,因为规范规定了标示符不能在外围的作用域内有效:
var f = function foo(){
return typeof foo; // foo是在内部作用域内有效
};
// foo在外部用于是不可见的
typeof foo; // "undefined"
f(); // "function"
既然,这么要求,那命名函数表达式到底有啥用啊?为啥要取名?
正如我们开头所说:给它一个名字就是可以让调试过程更方便,因为在调试的时候,如果在调用栈中的每个项都有自己的名字来描述,那么调试过程就太爽了,感受不一样嘛。
更多内容请见原网页 http://www.cnblogs.com/TomXu/archive/2011/12/29/2290308.html