函数声明与函数表达式
函数声明:
function 函数名称 (参数:可选){ 函数体 }
函数表达式:
function 函数名称(可选)(参数:可选){ 函数体 }
如何辨别
不包含函数名为函数表达式,如果包含,参见下文
函数声明:
1. function foo(){} // 声明,因为它是程序的一部分
2. (function(){
function bar(){} // 声明,因为它是函数体的一部分
})();
函数表达式
1. var bar = function foo(){}; // 表达式,赋值表达式的一部分
2. new function bar(){}; // 表达式,new表达式
3. (function foo(){}); // 函数表达式:包含在**分组操作符**内
有何作用
函数声明会在任何表达式被解析和求值之前先被解析和求值,即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值
eg:
alert(fn()); //正常弹出,因为执行前已定义fn
function fn() {
return 'Hello world!';
}
特例:
if语句也可以声明函数,但各浏览器结果不同
if (true) {
function foo() {
return 'first';
}
}
else {
function foo() {
return 'second';
}
}
foo();//经测试Chrome无论条件真假都会返回second;
// 相反,这样情况,我们要用函数表达式
var foo;
if (true) {
foo = function() {
return 'first';
};
}
else {
foo = function() {
return 'second';
};
}
foo();
关于分组操作符:
try {
(var x = 5); // 分组操作符,只能包含表达式而不能包含语句:这里的var就是语句,去掉小括号正常;
} catch(err) {
// SyntaxError
}