定义函数的三种方法
1.函数声明
function functionName(arg0, arg1, arg2) {
//函数体
};
函数声明最重要的一个特性是函数声明提升,即在执行代码之前会先读取函数声明,因此可以把函数声明放在调用它的语句后面。
2.函数表达式(2种),也叫函数字面量
2.1没有标识符的叫匿名函数(拉姆达函数)
var functionName = function(arg0, arg1, arg2) {
//函数体
};
没有命名的函数表达式比较常见,比如不希望函数声明提升时,特别是在一些初始化函数时,可以考虑使用匿名函数。
2.2 有标识符的叫命名函数表达式
var functionName = function foo(arg0, arg1, arg2) {
//函数体
};
3.构造函数法
var functionName = new Function('arg0', 'arg1', 'return arg0 + arg1;');
命名函数表达式的应用
对于递归,使用arguments.callee 代替函数名,可以确保调用函数不出问题,但是在严格模式下,不能通过脚本访问 argumnts.callee,这时,可以使用命名函数表达式来达到相同的效果。
var factory = (function f(num) {
console.log(f); //标识符 f 只在函数作用域中有效,打印标识符f num 次
if (num <= 1) {
return 1;
}
else {
return num * f(num - 1);
}
});
f = 0;
console.log(f); //0
factory(2);
/*
ƒ f(num) {
console.log(f);
if (num <= 1) {
return 1;
}
else {
return num * f(num - 1);
}
}
ƒ f(num) {
console.log(f);
if (num <= 1) {
return 1;
}
else {
return num * f(num - 1);
}
}
2
*/
有标识符的函数,调用栈会显示被调用函数的函数名,方便调试。