函数的定义方法有三种
1.函数表达式
2.函数声明
3,new function构造函数
这边主要看下函数表达式和函数声明
函数表达式(未省略标志的) var alertName = function nameAlert(name){ alert("name" + "是大帅哥!"); }; alertName("博主"); 函数表达式(省略标志的) var alertName = function (name){ alert("name" + "是大帅哥!"); }; alertName("博主"); 函数声明 function nameAlert(name){ alert("name" + "是大帅哥!"); }; nameAlert(“博主”);
函数声明和函数表达式的关系是非常微妙的。
1.函数声明 必须始终带有一个标识符(Identifier),也就是我们所说的函数名,而函数表达式则可以省略。
2.ECMAScript通过上下文来区分两者。
假如 function foo(){} 是一个赋值表达式的一部分,则认为它是一个函数表达式。而如果 function foo(){} 被包含在一个函数体内,或者位于程序(的最上层)中,则将它作为一个函数声明来解析。
我们来看几个例子
function foo(){}; // 声明,因为它是程序的一部分 var bar = function foo(){}; // 表达式,因为它是赋值表达(AssignmentExpression)的一部分 new function bar(){}; // 表达式,因为它是New表达式(NewExpression)的一部分 (function(){ function bar(){}; // 声明,因为它是函数体(FunctionBody)的一部分 })(); (function foo(){})这也是函数表达式,因为在它被包含在一对圆括号中的函数,在其上下文环境中,()构成了一个分组操作符,而分组操作符只能包含表达式
这样就可以改一个自执行函数,例如(function foo(){})();
3.函数声明和函数表达式还有个重要的区别:函数声明总是在作用域开始时先行解析,而函数表达式只会在遇到时才开始运算;
举个例子
sayTruth();<!-- 函数声明 --> function sayTruth(){ alert('myvin is handsome.'); } sayTruth();<!-- 函数表达式 --> var sayTruth=function(){ alert('myvin is handsome.'); }
上面第一个由于函数声明能提前解析(在浏览器预执行代码的时候就执行了,在执行代码的时候就不执行了),所以能正常输出myvin is handsome.而第二个是不能正常输出的。事实上var 声明变量的话 变量被提前声明了,只是没有初始化而已
4.ECMAScript规范中表示,函数声明语句可以出现在全局代码中,或者内嵌在其他函数中,但是不能出现在循环、条件判、或者try/finally以及with语句中。这时候我们可以使用函数表达式